Laden...

Forenbeiträge von StefanG Ingesamt 19 Beiträge

05.11.2014 - 13:17 Uhr

Hallo,

seit kurzem habe ich das Problem, dass wenn ich eine bestimmte xaml meines Projektes öffnen will, ganz Visual Studio abstürzt. Es gibt nur die Meldung, dass Visual Studio nicht mehr läuft.

Der xaml code kann geladen werden. Der Fehler tritt erst auf, wenn Visual Studio versucht, den Inhalt grafisch darzustellen.

Wenn ich die Datei mit einem xaml Editor öffne (hier Kxaml), dann bekomme ich eine Fehlermeldung, die mir allerdings nichts sagt:

Fehlermeldung:
Zeilennummer"3" und Zeilenposition "9" von "Der angegebene Klassenname "a.b.View.ViewShell" entspricht nicht dem tatsächlichen Stamminstanztyp "System.Windows.Window". Entfernen Sie die Klassendirektive, oder geben Sie eine Instanz über XamlObjectWriterSettings.RootObjectInstance an.".

Das einzige was ich daraus schließen kann, ist dass der ViewShell nicht "Window" ist. In der Code-behind Datei steht aber

public partial class ViewShell : Window

Zeilennummer 3 im xaml ist diese:

<Window x:Class="a.b.View.ViewShell"

hat jemand eine Idee, woran das liegen könnte?

Grüße,
Stefan

16.10.2013 - 14:42 Uhr

Hallo zusammen,

ich habe folgendes Problem:

In einer Anwendung für Touchscreens habe ich verschiedene mini-Tools. Da ich ein bisschen weg von der normalen Mausklick Metapher gehen möchte, suchte ich nach einer anderen Möglichkeit, diese Tools wieder vom Bildschirm zu entfernen, als auf ein "x"-Button oder ähnliches drücken zu müssen.

Meine Idee war es, ähnlich wie bei mobilen Betriebssystemen, einen Papierkorb einzublenden, sobald man anfängt, das Control zu verschieben und es freizugeben, sobald man es darüber zieht und loslässt.

Leider lassen mich meine WPF-Kenntnisse hier schon im Stich und hoffe daher, ihr könnt mir ein paar Tipps zur Umsetzung geben.

Ich habe nach verschiedenen Events gesucht wie TouchDown,TouchUp, ManipulationStarted, etc. jedoch scheint außer TouchDown keines der anderen Events aufgerufen zu werden.

Was wäre also der geschickteste Weg das zu realisieren?

Eine Generelle Methode, bei der man irgendein Objekt über den Bin ziehen kann un d erst dann entschieden wird, ob es ein Objekt ist, was entfernt werden soll wäre auch schön, steht aber erstmal noch hinten an.

Ich bin für jede Hilfe sehr dankbar. Fragen beantworte ich natürlich auch gern.

14.03.2013 - 15:27 Uhr

Ups! Alter code. Statt Main() steht da Run()

14.03.2013 - 14:26 Uhr

Hallo,

ich versuche in meiner Anwendung einen Splashscreen zu implementieren. Mir ist bewusst, dass ich einfach die Buildaction eines png's auf Splashscreen stellen kann, mir fehlt dabei jedoch die Möglichkeit, einen Ladefortschritt anzuzeigen.

Ich habe mich also auf die Suche nach vorhandenen Lösungen gemacht und bin auf dieses Tutorial gestoßen:

So weit so gut. Da ich schon einiges an Code habe, habe ich keine neue App Klasse erstellt, sondern den Code in die vorhandene App.xaml.cs eingefügt


public partial class App : Application
    {
        [STAThread()]
        static void Main()
        {
            Splasher.Splash = new IPA.Merlin.View.SplashScreen();
            Splasher.ShowSplash();

            for (int i = 0; i < 1000; i++)
            {
                MessageListener.Instance.ReceiveMessage(string.Format("Load module {0}", i));
                Thread.Sleep(1);
            }

            new App();
        }
        /// <summary>
        /// 
        /// </summary>
        public App()
        {
            StartupUri = new System.Uri("View/MainView.xaml", UriKind.Relative);

            Main();
        }

Ich habe dann den Program Entrypoint in den Projekteinstellungen auf diese Main Methode geändert.

Beim Ausführen, wird auch der versprochene Splashscreen mit dem Fortschritt angezeigt (von der Seite funktioniert alles), jedoch bekomme ich beim anschließenden Aufrufen der MainView.xaml folgenden Fehler : "{"Zeilennummer &quot;15&quot; und Zeilenposition &quot;122&quot; von &quot;Die Angabe eines Werts für &quot;System.Windows.StaticResourceExtension&quot; führte zu einer Ausnahme.&quot;."}"

bzw. die InnerException : {"Die Ressource mit dem Namen &quot;Locator&quot; kann nicht gefunden werden. Bei Ressourcennamen wird die Groß- und Kleinschreibung berücksichtigt."}

Bei Locator handelt es sich um mein HauptViewModel. In der MainView.xaml wird diese so eingebunden:

DataContext="{Binding shell, Source={StaticResource Locator}}" WindowStartupLocation="CenterScreen" Topmost="False" ResizeMode="CanResize">

Das funktioniert in der Regel auch ganz gut so, allerdings scheint durch meine "Umleitung" diese Resource nicht geladen zu werden.

Hat jemand eine Idee, woran das liegen könnte?

Grüße,
Stefan

06.12.2011 - 10:18 Uhr

Hallo,

ich habe zur Zeit die Aufgabe bestimmte Objekte auf den Bildschirm zu zeichnen. Als Vorgabe habe ich allerdings nur Millimeterangaben vom Bildschirmrand aus. Wie kann ich das umrechnen?

Muss ich dann von der Bildschirmauflösung und DPI Zahl irgendwie umrechnen?
(Wie man die dpi bei wpf rausfindet ist mir auch noch nicht klar)

Zusätzlich muss ich Linien in bestimmten Dicken zeichnen. Dafür gibt es ja z.B. StrokeThickness, aber was repräsentiert dann ein Wert von 10? Pixel?

Ich habe irgendwo gelesen, dass bei Windows immer von 96 DPI ausgegangen wird, wobei dann 96 Pixel = 25.4 mm entsprechen sollen.

In den Anzeigeeinstellungen von Windows steht bei mir bei den Schriftarten aber z.B., dass eine DPI von 120 verwendet wird. Hat das Einfluss darauf?

Hoffe mir kann jemand helfen.

Grüße, Stefan

26.09.2011 - 11:03 Uhr

Hi,

ich muss auf einem Hauptfenster zu unterschiedlichen Zeiten verschiedene Inhalte anzeigen. Dazu habe ich auf der Form ein ContentControl plaziert, dessen ContentTemplate ich dann über einen Trigger auf das entsprechende DataTemplate zeigen lasse.

Daraus ergeben sich jetzt für mich 2 Probleme:

  1. Wie kann ich die Controls einfaden lassen ?

Wie ich die animation an sich erstelle ist mir klar, ich weiß jedoch nicht, wie ich diese dann starten kann. Am naheliegensten wäre ja ein Eventtrigger, der startet, wenn das entsprechende DataTemplate geladen wird. Aber welches Event kommt dafür in Frage? Ich habe schon fast alle durchprobiert, aber keines davon wurde genau dann angesprungen

2)Wie spreche ich die Komponenten aus dem DataTemplate in der CodeBehind datei an?

Ich habe auf einem der Templates einen Container, den ich soweit ich bisher weiß nur über code und nicht mit reinem xaml füllen kann. Da das DataTemplate selber aber nicht in der MainView.xaml definiert ist, wird der Container in der MainView.xaml.cs natürlich nicht erkannt. Ich könnte diesen natürlich an mein ViewModel binden, das ja eigentlich nichts von der View wissen sollte.

12.09.2011 - 17:24 Uhr

oh, das sieht gut aus. Werde das mal testen.

Hatte nur irgendwie gehofft, wpf würde das bereits unterstützen, aber immerhin.

Danke.

12.09.2011 - 16:58 Uhr

Hi,

ich brauche für eine Touchanwendung (WPF) eine Bildschirmtastatur. Da ich das Rad nicht neu erfinden möchte, dachte ich mir, ich könnte ja die in Windows 7 integrierten Tastatur nehmen.

Wenn ich z.B. in eine Textbox klicke, dann wird mir auch ein kleines Feld angezeigt, welches dann die Tastatur in den Vordergrund holt (alternativ kann man sie ja von oben reinziehen.

Ich würde aber an bestimmten Programmstellen, die Tastatur per Code erscheinen lassen. Weiß jemand, ob bzw. wie das geht?

Grüße, Stefan

08.09.2011 - 14:18 Uhr

Hallo zusammen.

Ich habe eine Listbox, der ich ein ItemTemplate zugewiesen habe


<Listbox.......>
   <Listbox.ItemTemplate>
      <DataTemplate>
         <DockPanel>
            <TextBlock......../>
            <Checkbox......../>
         </DockPanel>
      </DataTemplate>
   </Listbox.ItemTemplate>
</Listbox>

so ungefähr (unwichtige Sachen weggelassen). Als ItemSource verwende ich eine CollectionViewSource, die wiederum von einer ObservableCollection ihre Daten bekommt. Die CVS sortiert und Gruppiert diese Daten dann, damit sie entsprechend Gruppiert auch in der Listbox dargestellt werden können. Das funktioniert (von der Anzeige her) auch schon ganz gut (siehe Screenshot).

Jetzt muss ich ja aber wissen, wenn ich eine Checkbox oder den "+"-Button bei den Gruppen anklicke, welche Checkbox ich jetzt genau angeklickt habe. Den SelectedIndex der Listbox kann ich nicht verwenden, da man die Checkbox auch anklicken kann, wenn das ListboxItem an sich nicht ausgewählt ist.

Ich hatte mir überlegt, der Checkbox und dem Textblock evtl. als Tag den Index zuzuweisen, aber ich habe keine Ahnung wie das gehen sollte und wahrscheinlich gibt es geschicktere Möglichkeiten das zu erreichen.

Hat jemand eine Idee?

Danke, Stefan

07.09.2011 - 17:52 Uhr

mh dann weiß ich auch nicht....falls nicht schon geschehen, probier halt nochmal das

sb_aus_eins.Completed += new EventHandler(sb_aus_finish1);

VOR das sb_aus_eins.Begin();

zu setzen

07.09.2011 - 17:45 Uhr

Die beiden Methoden sind aber schon in der gleichen Klasse?

07.09.2011 - 17:24 Uhr

Wieso erstellst du das Storyboard denn nicht in xaml und verweist da auf den Eventhandler?

07.09.2011 - 16:39 Uhr

Vielleicht geht es, wenn du das Event erstellst, bevor du die Animation startest.

07.09.2011 - 16:00 Uhr

und im Endeffekt soll es etwa so aussehen:

(siehe Anhang)

Wie kann ich diesen Grauen Hintergrund wegbekommen bzw. ihm eine andere Farbe geben?

mein Template sieht zur Zeit so aus:

<my1:SurfaceListBox ItemsSource="{Binding NewsList}"  
                            Grid.Column="1" Grid.ColumnSpan="4" Grid.Row="5"  
                            BorderBrush="#FFDB6722"  
                             
                            HorizontalAlignment="Left" Margin="7,0,0,149"  
                            Width="243" HorizontalContentAlignment="Stretch" 
                            Name="lbNews" > 
            <my1:SurfaceListBox.ItemTemplate> 
                <DataTemplate> 
                    <DockPanel Margin="5"> 
                        <Ellipse Height="13" Width="13" StrokeThickness="3" Stroke="#FFDB6722" Margin="5" VerticalAlignment="Center" DockPanel.Dock="Left"/> 
                        <TextBlock x:Name="txt" TextWrapping="WrapWithOverflow" Text="{Binding newsText}" FontSize="11" MaxWidth="120" VerticalAlignment="Center"/> 
                        <my1:SurfaceCheckBox IsChecked="{Binding bFinished}" Margin="3,0,0,0" HorizontalAlignment="Right" DockPanel.Dock="Right" VerticalAlignment="Center" BorderBrush="#FFB4B4B4" Foreground="Black" Width="5" Height="5" IsEnabled="True"> 
                            <my1:SurfaceCheckBox.Template> 
                                <ControlTemplate 
                                    TargetType="{x:Type CheckBox}"> 
                                    <Border BorderBrush="{TemplateBinding BorderBrush}"  
                                            BorderThickness="{TemplateBinding BorderThickness}"  
                                            Background="{TemplateBinding Background}" 
                                            Width="20" 
                                            Height="20"> 
                                        <Grid> 
                                            <ContentPresenter  
                                                Content="{TemplateBinding Content}"  
                                                ContentTemplate="{TemplateBinding ContentTemplate}"  
                                                Margin="{TemplateBinding Padding}"  
                                                HorizontalAlignment="{TemplateBinding   
                                                HorizontalContentAlignment}"  
                                                VerticalAlignment="{TemplateBinding  
                                                VerticalContentAlignment}" /> 
                                            
                                            <Border> 
                                                <Border.Background> 
                                                    <VisualBrush> 
                                                        <VisualBrush.Visual> 
                                                            <Path Name="path"  
                                                                  StrokeThickness="1" 
                                                                  StrokeStartLineCap="Round"  
                                                                  StrokeEndLineCap="Round"  
                                                                  StrokeLineJoin="Round" /> 
                                                        </VisualBrush.Visual> 
                                                    </VisualBrush> 
                                                </Border.Background> 
                                            </Border> 
                                        </Grid> 
                                    </Border> 
                                    <ControlTemplate.Triggers> 
                                        <Trigger Property="IsChecked" Value="True"> 
                                            <Setter TargetName="path"  
                                                    Property="Data"  
                                                    Value="M 0 2.5 L 1.5 5 5 0" /> 
                                            <Setter TargetName="path"  
                                                    Property="Stroke"  
                                                    Value="#FFDB6722" /> 
                                        </Trigger> 
                                    </ControlTemplate.Triggers> 
                                </ControlTemplate> 
                            </my1:SurfaceCheckBox.Template> 
                        </my1:SurfaceCheckBox> 
                    </DockPanel> 
                </DataTemplate> 
            </my1:SurfaceListBox.ItemTemplate> 
        </my1:SurfaceListBox>  

Zweite Frage: Wie man im letzten Bild sehen kann, sind die Einträge da noch nach Datum sortiert. Wie kann man das Designmäßig realisieren? Gibt es da Master-Detail-Templates oder sowas?

Hoffe mein Problem ist verständlich, bin dankbar für jeden Hinweis

07.09.2011 - 15:58 Uhr

Nach der Ausführung sieht es allerdings schon so aus:

07.09.2011 - 15:57 Uhr

Hallo Zusammen,

ich bin gerade dabei Komponenten in WPF für unsere Zwecke optisch anzupassen.
Bei der Anpassung einer Listbox habe ich 2 kleine Probleme:

ich habe das Itemtemplate bereits soweit bekommen, dass es (im Designer) so aussieht:

29.08.2011 - 16:48 Uhr

ja stimmt hatte ich nicht. Habe das mal so versucht:


public class MainViewModel : ViewModelBase, INotifyPropertyChanged
{
   [...]
   
   private bool _isLoginRight= false;
   public event PropertyChangedEventHandler PropertyChanged;

   [...]

   public bool testValue
   {
      get { return _isLoginRight}
      set 
      {
         if(_isLoginRight != value && PropertyChanged != null)
            PropertyChanged(this, new ProperChangedEventArgs("IsLoginRight"));
      }
   }
}

public class LoginViewModel : ViewModelBase
{
   [...]

        private void OnLoginExecuted(object parameter)
        {
            if (MockDataBase.isLoginValid(userName, passWord))
            {
                MessageBox.Show("login successful");
                MainViewModel _main = new MainViewModel();
                _main.IsLoginRight = true;
            }
        }

   [...]
}


der Setter im MainViewModel wird auch angesprungen, aber PropertyChanged ist immer null 😦

Muss ich das selber irgendwo initialisieren? Ich bin davon ausgegangen dass der Compiler das durch das Binding automatisch macht.

lg

UPDATE: ich habe durch das erneute erstellen des MainViewModels wohl die Variable da geändert, wo sie nicht gebunden war.

Ersetzt man den Teil oben durch


ViewModelLocator.Main.IsLoginRight = true;

(ViewModelLocator hält alle erzeugten ViewModel Instanzen vor)

dann ist PropertyChanged nicht mehr null und wird auch aufgerufen....leider passiert dennoch nichts, d.h. die dafür vorgesehene Animation wird nicht abgespielt....noch irgendwelche Hinweise?

29.08.2011 - 15:26 Uhr

Hallo zusammen,

ich bin noch sehr neu in sowohl WPF, als auch dem mvvm Muster. Trotzdem muss ich gezwungenermaßen beides für die Entwicklung einer Software nutzen und stoße immer wieder auf Probleme, für die ich im Netz entweder gar keine Antwort finde, oder ich sie wohl einfach nicht verstehe.

Problem ist folgendes:

Ich habe eine MainView (und ein MainViewModel) und Ein UserControl, welches sich zu beginn über die MainView legen soll und Zugangsdaten abfragt. Das UserControl befindet sich bereits auf der MainView, jedoch mit Opacity = 0.

Ich habe es mittlerweile hinbekommen ein Storyboard zu erstellen, dass im Onload-Event das UserControl langsam einblenden lässt. Nachdem Benutzername und Passwort eingegeben wurden werden sie im LoginViewModel (welches der Datakontext des UserControls ist) auf richtigkeit überprüft. Wenn sie richtig sind, möchte ich das Control wieder ausfaden, also die gleiche Animation rückwärts abspielen und Das Control anschließend vom Hauptfenster entfernen.

Meine Versuche dahingehend liefen aber alle bislang ins leere. Mein letzter Versuch sah so aus, dass ich einen Datatrigger angelegt habe

MainView.xaml


    <s:SurfaceWindow.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsLoginRight}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource Login_end}"/>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </s:SurfaceWindow.Style>

Wenn das LoginViewModel feststellt, dass die Daten richtig sind, ruft sie im MainViewModel eine Funktion auf, die wiederum IsLoginRight auf true setzt. Ich dachte, dass jetzt eigentlich die Animation starten müsste, aber das tut sie nicht. Kann mir jemand einen Tipp geben, was ich falsch mache?

PS: Die Variable wird tatsächlich geändert, nur reagiert der Datatrigger nicht darauf