Laden...
.
.tim myCSharp.de - Member
Softwareentwickler Mainz Dabei seit 21.12.2006 332 Beiträge
Benutzerbeschreibung

Forenbeiträge von .tim Ingesamt 332 Beiträge

30.04.2008 - 16:15 Uhr

Ok meine Architektur sieht folgendermassen aus. Ich habe eine Windows.Form Anwendung und eine DLL mit meinen Klassen.

Da ich aber die WPF Techniken nutzen möchte, habe ich eine 3tes Projekt erstellt, in dem die WPF Controls enthalten sind.

Das Windows Form hat bisher immer UserControls in dem Form ausgetauscht. Damit ich nun WPF Controls einbinden kann, enthalten die UserControls nur noch die Logik und über ein ElementHost wird das WPF Control dargestellt.

Ich sehe es theoretisch genauso, dass die WPF Controls default-Aussehen haben.

Nur wie kann ich über meine Anwendung definieren wie die Styles von den Controls sind. Das Problem ist, dass auf dem WPF Control verschiedene Controls vorhanden sein können, die auch wiederrum WPF Controls beinhalten usw.

Wie kann sowas sauber realisiert werden?

EDIT:
Ok nehmen wir an ich mappe die Styles von den Untercontrols auf dem WPF Controls auf public Properties. Dann hätte ich noch immer das Problem, das ich von einer Windows.Form Anwendung auf kein ResourceDictionary zugreifen kann. Erstellen kann ich dies ja leider dort auch nicht.

30.04.2008 - 14:09 Uhr

Diese, ich nenne sie LayoutManager (Grid, Canvas) haben ein unterschiedliches Verhalten. Sie sind für Unterschiedliche Zwecke gedacht.

Um ein ähnliches Verhalten wie Anchor zu nutzen, empfehle ich dir ein Grid. Ein Canvas ist eher für eine absolute Positionierung gedacht.

Leider ist WPF durch einen enormen Funktionszuwachs auch komplzierter geworden. So ist es aber immer. Umso mehr Möglichkeiten man haben möchte, umso schwerer ist es somit auch, das Beste für sich zu finden.

30.04.2008 - 12:22 Uhr

<Image.Triggers>HIER</Image.Triggers> 🙂

Triggers kommt vom FrameworkElement.

30.04.2008 - 12:05 Uhr

Ich habe zwar nicht verstanden wieso das so ist, aber ich nehme es einfach mal so hin.

Vielen Dank für deine Hilfe.

29.04.2008 - 13:43 Uhr

Vielen Dank.

... Wenn du nun die ItemsSource setzt, dann befindet sich in der Items-Auflistung eine Collection deiner Objekte.

Ok, also kann ich mir das folgendermassen vorstellen. Mein ListViewItem hat ein Child, welches mein Item aus dem Source entspricht. In meinem ControlTemplate bin ich auf der Ebene des Childs und kann deshalb mit Binding auf die Eigenschaften von meinem Typ zugreifen. Um nun wieder zu meinem Parent (dem ListViewItem) zu gelangen, muss ich TemplateBinding nutzen?

Habe mir das so hergeleitet, da Template Binding {Binding RelativeSource={RelativeSource TemplatedParent}} laut MSDN entspricht.

Erstelle dir eine Methode/Eigenschaft, welche dir den Gesamtpfad zurückgibt und diesen bindest du dann einfach.

Schade, dass soetwas nur so umständlich ist. Eine Möglichkeit wie Key="Mein Statischer Wert {Binding ...}" wäre viel praktischer 🙂

Dein UserControl ist ja auch nur ein Element. Probiere es mit einem Binding unter Angabe des ElementName und verweise auf deine entsprechende Property. Achte darauf, dass es sich um eine DependencyProperty handelt. Das sollte funktionieren, ohne es jetzt getestet zu haben.

In dem Fall dürfte ich das Template aber nicht in ein ResourceDictionary auslagern, da zu dem Zeitpunkt der ElementName noch garnicht exisiert, bzw. nicht bekannt ist, dass er jemals existieren wird. Somit kann ich wieder nicht wirklich Design zentral verwalten.

Eine Skinfähigkeit unter WPF durchzusetzen, ist meiner Meinung nach nicht einfacher als bei Windows Forms, leider 🙁

29.04.2008 - 11:38 Uhr

Vielen Dank. Genau soetwas hatte ich gesucht.

Falls du die Zeit findest, wäre es echt toll, wenn du noch meinen vorherigen Beitrag beantworten könntest.

25.04.2008 - 12:01 Uhr

Nocheinmal vielen Dank.

Und zwar: Durch das ControlTemplate legst du ja fest, für welchen Typ es zuständig ist bzw. in welchem Typ es verwendet wird. Dieser Typ IST ein ListViewItem. Dieses bietet Eigenschaften an, die verwendet werden können (IsSelected zum Beispiel).

Nun fügst du eigene Objekte der Items-Auflistung hinzu (DataSource, wie auch immer). Diese werden für das DataBinding verwendet, d.h. er findet so auch den angegebenen Pfad, weil pro ListViewItem auf das Objekt geachtet wird, das darin enthalten ist.

Das heisst also, ich kann sowohl "{Binding Path=EigenschaftMeinesTyp}" und "{Binding Path=EigenschaftListView}" nutzen?

Du hast geschrieben "Dieser Typ IST ein ListViewItem". Das ControlTemplate bezieht sich doch genau auf ein Item und das kann doch nur von einem Typ sein. Ich verstehe die Logik irgendwie nicht. Befinde ich mich in einem ListViewItem oder in einem Item von meinem Typ? Ich stelle mir das so vor, dass ich mich in dem Design Bereich einer foreach Schleife befinde. Ich hoffe du verstehst was ich meine.

Du kannst das über einen ObjectDataProvider in deinen Ressourcen machen und da das Ergebnis einer Methode etc. binden.

Ok danke, aber in dem Fall kann ich nun nur an den Pfad binden. Ich möchte aber sozusagen den Sourcestring aus 2 Bindungen zusammensetzen. D.h. sowas wie Pfad (Bindung1) + Dateiname (Bindung2).

Ich versuche die Zeit zu finden, dir da ein Beispiel zu erstellen.

Das wäre super.

Eine Kleinigkeit ist mir auch noch unklar. Wenn ich mich in dem ControlTemplate befinde, habe ich nur einen Bezug auf ein ListViewItem. Dieses ControlTemplate nutze ich in einem UserControl. Was ist aber wenn ich aus dem ControlTemplate auf Eigenschaften des UserControls zugreifen möchte. Ich habe da folgendes Problem. Mein UserControl hat eine Eigenschaft DefaultImageSource. Wenn kein ImagePath in meinen Items vorhanden ist, soll dieser DefaultImageSource genutzt werden. Meine Idee in der Sache wäre ein Trigger, der ja (wahrscheinlich) auf die Eigenschaften des Items zugreifen kann. Aber wie sag ich dem Trigger dann, dass er den ImageSource Pfad in dem Fall auf DefaultImageSource setzen soll?

24.04.2008 - 15:13 Uhr

Ersteinmal vielen Dank, das du dir das angeschaut hast.

EDIT:
Die Items gehen über den Source in das ListView als BindingList<>

1 u. 2) So ganz ist es mir nicht. Ich greife doch zB im Trigger auf Eigenschaften von ListViewItem (IsSelected) zu und binde auf der anderen Seite an Member von meinem Typ (ElementContent).

  1. Ich habe z.B. eine statische Eigenschaft in einem Singleton Objekt. In meinem Fall habe ich z. B. einen Pfad. Nun möchte ich gerne den ImageSource setzen, Pfad (nicht im Item vorhanden) + Dateiname. Wobei der Dateiname in dem Item vorhanden ist.

  2. D.h. um z.B. im ControlTemplate die Breite eines Image(Containers) per Trigger zu ändern, müsste ich diese Eigenschaft an eine (Dummy) Eigenschaft des Items binden?
    Nun sind wir aber bei Problem 1 u. 2. Im Trigger kann ich doch nur auf die Eigenschaften von ListViewItem und nicht meinem Typ zugreifen.

EDIT: Ich möchte z. B. bei nem IsSelected eine Animation starten oder so.

24.04.2008 - 14:11 Uhr

Das ist der aktuelle Stand. Dabei geht es auch mehr um das Verständis der Sache.
Das komplette Projekt würde den Umfang sprengen.

Bitte les dir vorallem meinen 2ten Beitrag und die darin enthaltenen vorhanden Fragen durch. Dann verstehst du was ich grundlegend nicht verstehe.

24.04.2008 - 14:02 Uhr

Eine App.xaml habe ich ja leider nicht (DLL) und bringt bei den Controls auch nichts.
Bei den Styles werden selbst die "primitiven" Controls wie z.B. Button oder Labels angesprochen.

Wenn man hört wie toll, WPF ist, wird oft gesagt:

"Man kann Styles definieren und dafür sorgen, dass alles gleich aussieht"

So einfach ist es aber nicht, dies ist nur die halbe Wahrheit. Wieso gibt es dafür keine "globale" Lösung für eine komplette DLL.

Wäre es nicht schön, für ein Namespace ressourcen hinterlegen zu können 🙂
Wenn dazu noch die Funktionaliät von partiellen XAML Files existieren würde, wären meine Probleme gelöst.

Und genau zu diesem Zeitpunkt, wäre die Aussage "Man kann Styles definieren und dafür sorgen, dass alles gleich aussieht" für mich auch wahr.

Wieso kann man Styles nicht genauso wie Klassen betrachten. Somit könnte man die Styles ohne Probleme einbinden und auch viel kompfortabler davon ableiten.

Für mich ist die Sache ein unnötiger riesen Verwaltungsaufwand und ist auch für eine Erweiterbarkeit nicht sonderlich hilfreich.

24.04.2008 - 13:45 Uhr

Ich sitze seit einem Monat an paar Sachen die für mich Grundlagen sind und habe noch nichts gefunden, dass mir bei der Lösung helfen könnte.
Wenn du Lust und Zeit hast, wäre es super, wenn du einen Blick auf folgende Thread werfen könntest:
ListView und WrapPanel

Vielleicht verstehe ich auch etwas falsch und es ist einfacher als ich dachte. Aber ich frage mich halt, wieso etwas so Grundlegendes, nirgendwo angesprochen wird.

24.04.2008 - 13:32 Uhr

Es ist nicht möglich etwas bestimmtes zu machen. Weil nirgendwo zu finden ist, wie es geht 😉

Ich will keinesfalls behaupten, dass es nicht möglich ist, weil der Umfang fehlt.

24.04.2008 - 13:29 Uhr

Genau so habe ich es auch umgesetzt. Nur leider kommt es da, zu dem oben beschriebenen Fehler.

Ich beschreibe das Problem noch etwas anders.

Wenn ich alle Basisstyles inkl. Spezialisierungen in eine Datei schreibe, brauche ich nur diese Datei "inkludieren".

Sobald ich diese Dateien auslagere, muss die Datei mit den spezialisierten Styles/Templates die Datei in Richtung Basisklasse inkludieren.

Das bedeutet, ich kann nur eine "extrem" Spezialisierung inkludieren. Ansonsten würden die Basisklassen mehrfach durch die spezialisierenden Dateien inkludiert.

Auch wenn es funktioniert, wäre es keine gute Lösung.

24.04.2008 - 13:19 Uhr

Ich sehe es schon als Problem.

Dadurch ist es erst garnicht möglich etwas bestimmtes zu entwickeln. Wenn dies spezielle Sachen wären, würde ich es genauso sehen. Teilweise handelt es sich dabei aber um Grundlagen.

24.04.2008 - 13:14 Uhr

Bei meinem Projekt wird es sehr viele Templates und Styles geben.
Die Styles basieren teilweise auf andere Styles. D.h. es gibt ein Basis Style und spezialisierte Styles.
Deshalb würde ich gerne mehrere ResourceDictionary nutzen.
Dazu kommt, dass es sich dabei um eine DLL mit UserControls handelt.

Damit die spezialisierten Styles das Basis Style kennen, muss ich in dieser Datei die Basis Style Datei als Merged Dictionary angeben.

Dieses vorgehen, finde ich nicht so der Hit. Ich hätte gerne ein Dictionary das die Basis Style Files "inkludieren" und diese die Spezialisierungen.

Nun müsste ich zwar noch immer in jedem UserControl noch ein Dictionary inkludieren, aber das wäre noch ok.

Selbst wenn ich alle Spezialisierungen inkludiere, kommt es zu dem Problem.
Der "Designer" toleriert es zwar, aber zur Laufzeit kommt ein Fehler der aussagt, dass das Basis Style nicht gefunden wurde.

Wie habt ihr bereits sowas realisiert, was sind eure Ideen oder gibt es dafür ein bekannte Strategie wie man damit gut umgehen kann?

24.04.2008 - 12:42 Uhr

Ich finde WPF auch sehr interessant.

Das Prinzip, Controls in Controls nun wirklich zu verschachteln war unter Windows.Forms immer sehr schlecht möglich.

Endlich gibt es verschiedene Layout Manager. Dieser Punkt war unter Java bisher ein riesen Vorteil.

Das schlimmste ist aber, dass die Doku nicht wirklich komplett ist. Ich habe einpaar Problem, dazu existiert auch ein Thread: ListView und WrapPanel

Diese Probleme konnte ich noch immer nicht lösen. Ich frage mich, wieso die Doku und sonstige Artikel oder Bücher darauf keine Antwort geben können.

Vielleicht ist meine Denkweise noch eine andere. Für mich ist aber genau dieser Faktor ausschlaggebend.

Mir fehlt da leider etwas der Überblick.

24.04.2008 - 12:34 Uhr

Du musst einen Namespace definieren. Es handelt sich zwar um das gleiche Assembly und ggf. Namespace aber in WPF ist das etwas anders.

Wenn du dort keinen Prefix bzw. Namespace angibst, wird der std. Namespace genutzt und das ist: http://schemas.microsoft.com/winfx/2006/xaml/presentation

Um dir weiter helfen zu können, müsstest du nochmal genau beschreiben, wann und welcher Fehler bei dir erscheint.

24.04.2008 - 10:38 Uhr

Bei mir stehen die Resource XAML auf Page.

Der Fehler kommt bei dir, obwohl der "Buildvorgang" bei dir von GlassStyle.xaml auf Page steht?

24.04.2008 - 10:33 Uhr

An dem Problem habe ich auch sehr lange gearbeitet.
In dem folgenden XAML Ausschnitt sind 3 Trigger aufgeführt. Ich denke, dass wird dein Problem lösen.

 <ControlTemplate TargetType="{x:Type ListViewItem}">
                                <Border Margin="10" BorderBrush="White" BorderThickness="5" CornerRadius="10" Padding="10" Background="{TemplateBinding Background}">
                                    <ContentControl HorizontalContentAlignment="Stretch" HorizontalAlignment="Center">
                                        <StackPanel>
                                            <Image Source="{Binding Path=ImgPath}" Width="150" Height="100" Stretch="Fill" Margin="5"/>
                                            <TextBlock
                                                TextWrapping="Wrap"
                                                Width="150"
                                                Text="{Binding Path=ElementContent}"
                                                Foreground="{TemplateBinding Foreground}"
                                                Background="{TemplateBinding Background}">
                                            </TextBlock>
                                        </StackPanel>
                                    </ContentControl>
                                </Border>

                                <ControlTemplate.Triggers>

                                    <Trigger Property="IsSelected" Value="true">
                                        <!--Wenn das Item selected ist und aktiv-->
                                        <Setter Property="Background" Value="Black"/>
                                        <Setter Property="Foreground" Value="Yellow"/>
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="false">
                                        <!--Wenn das Item nicht selected ist-->
                                        <Setter Property="Background" Value="Yellow"/>
                                        <Setter Property="Foreground" Value="Black"/>
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsSelected" Value="true"/>
                                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                        </MultiTrigger.Conditions>
                                        <!--Wenn das Item selected ist und nicht aktiv-->
                                        <Setter Property="Background" Value="Black"/>
                                        <Setter Property="Foreground" Value="Orange"/>
                                    </MultiTrigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate> 
23.04.2008 - 17:52 Uhr

Da nun etwas Zeit vergangen ist und ich leider trotz intensivem suchen leider die Fragen noch immer offen sind, wollte ich fragen, ob zwischenzeitlich jemand eine Idee auf meine Fragen/Probleme hat.

Für jede Idee, wo ich suchen könnte, wäre ich sehr dankbar.

09.04.2008 - 10:49 Uhr

Leider bestehen die Fragen noch immer.

Ich habe weiterhin mehr probiert, aber komme noch weiterhin auf die selben Ergebnisse.

Es wäre super, wenn mir jemand einen Tipp geben könnte. Ein Artikel der die Probleme/Fragen lösen könnte, wäre auch sehr hilfreich.

Vielen Dank
.tim

04.04.2008 - 14:02 Uhr

Hallo, ich denke ich habe einen Fehler gefunden.

Mich würde interessieren ob dieser schon in einem Patch o.ä. behoben ist, bzw. ob dieser bei euch auch auftritt.

Es geht um System.Windows.Controls.ListView.

Ich habe als KeyboardNavigation.DirectionalNavigation Cycle eingestellt.
Wichtig ist für den Test, dass in dem ListView mindestens doppelt soviele Items vorhanden sind als Platz darin ist. D.h. es muss ein Scrollbalken erscheinen.

Wenn nun der Fokus in dem ListView ist und man mit der Cursor Nach-Unten Taste navigiert, funktioniert alles wunderbar.
Die Items werden bis zum Letzten selektiert und die Scrollbar läuft sauber mit. Sobald kein Item mehr vorhanden ist, springt die Selektion auf das erste Element und die Scrollbar springt auch zum Anfang. Ab diesem Moment funktioniert auch die Navigation über die Nach-Oben Taste sauber.

Wenn man nun die Anwendung neustartet und mit der Cursortaste Nach-Oben den oberen Rand erreicht, springt dieser nicht zum letzten Element, sondern zum letzten Element in der Ansicht.

Zuerst habe ich mich gefragt ob mit dem "Kreislauf - Cycle" die aktuelle Ansicht gemeint ist. Da ich dies aber für unsinniger halte, die anderen "unsichtbaren" Elemente zu ignorieren und dieses Verhalten ja auch bei der Nach-unten Taste entstehen müsste, bin ich mir sicher, dass dies nicht so gewollt ist.

04.04.2008 - 13:48 Uhr

Im Prinzip ist es ganz einfach:
Mach einfach das komplette Border in den Trigger rein und änder die Imagebreite.

Wie meinst du das?
Wie kann ich aus dem Trigger den Border ansprechen?
Wie kann ich die anderen Elemente des ControlTemplates ändern?

Eine Idee zu Frage 1-3?

03.04.2008 - 12:04 Uhr

Hat niemand eine Antwort auf meine ganzen Fragen? 🙁

01.04.2008 - 15:41 Uhr

Wie/Wann möchtest du XAML Datei bzw. Inhalt austauschen?

Schau dir mal die InitializeComponent Methode an. Da erkennst du, wie der XAML Code "eingelesen" wird.

Zuerst wird die eingebette Ressource (XAML Code) als System.Uri Objekt instanziiert und anschliessend per System.Windows.Application.LoadComponent geladen.

Vielleicht hilft dir das weiter.

Theoretisch ist zwar Logik und Designtrennung gedacht. Aber es muss ja zwischen diesen beiden Sachen ein Verbindung geben. D. h. in deinem XAML oder spätenstens im Code muss ja ein Bindung o. ä. stattfinden.

Somit enthält das XAML nicht nur reine Designkomponenten sondern auch teilweise die "Schnittstelleninformationen."

01.04.2008 - 15:29 Uhr

Ich habe etwas ausprobiert, dass teilweise funktioniert.

Ich habe für das **ListView ** ein **ItemContainerStyle ** definiert. Dieses Style hat den **TargetType ****ListViewItem **und überschreibt das Template mit dem folgenden XAML Code. Es gibt 4 Probleme auf die mir keine oder keine gute Lösung einfällt.

  1. Damit **IsSelected **von dem Trigger gefunden werden kann, muss der **TargetType ****ListViewItem **sein. Die Items sind aber von dem Typen myType. Nun könnte ich von **ListViewItem **ableiten. Dabei bekomme ich aber Probleme mit dem OR-Mapper. Dieser stört sich daran, das manche Member nicht als virtual gekennzeichnet sind. Theoretisch könnte ich mir die Arbeit machen, und die Member neu erstellen und auf die Basisfunktionalität mappen. Sprich "... new virtual ..."

  2. Wie kann es sein, dass alles ordentlich dargestellt wird? Das **ImgPath **und **ElementContent **gefunden werden, kann ich mir damit erklären, dass **ListViewItem **als **TargetType **ignoriert wird und **myType **diese Eigenschaften enthält. Wie ist dies aber mit **IsSelected **und Selector.IsSelectionActive, diese Eigenschaften sind nicht in myType vorhanden und können trotzdem fehlerfrei genutzt werden (Die GUI funktioniert, wie sie soll).

  3. **TextBlock.Text **ist an **ElementContent **gebunden. Wie kann ich einen Prefix (statischer Text und eine Eigenschaft eines Singleton-Objekts) hinzufügen?

  4. Wie kann ich das **ControlTemplate **manipulieren. D.h. wie kann ich z.B. durch einen Trigger bei **IsSelected **die Breite des Bildes ändern.

<ControlTemplate TargetType="{x:Type ListViewItem}">
                                <Border Margin="10" BorderBrush="White" BorderThickness="5" CornerRadius="10" Padding="10" Background="{TemplateBinding Background}">
                                    <ContentControl HorizontalContentAlignment="Stretch" HorizontalAlignment="Center">
                                        <StackPanel>
                                            <Image Source="{Binding Path=ImgPath}" Width="150" Height="100" Stretch="Fill" Margin="5"/>
                                            <TextBlock 
                                                TextWrapping="Wrap" 
                                                Width="150" 
                                                Text="{Binding Path=ElementContent}" 
                                                Foreground="{TemplateBinding Foreground}"
                                                Background="{TemplateBinding Background}">
                                            </TextBlock>
                                        </StackPanel>
                                    </ContentControl>
                                </Border>
                                
                                <ControlTemplate.Triggers>
                                    
                                    <Trigger Property="IsSelected" Value="true">
                                        <!--Wenn das Item selected ist und aktiv-->
                                        <Setter Property="Background" Value="Black"/>
                                        <Setter Property="Foreground" Value="Yellow"/>
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="false">
                                        <!--Wenn das Item nicht selected ist-->
                                        <Setter Property="Background" Value="Yellow"/>
                                        <Setter Property="Foreground" Value="Black"/>
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsSelected" Value="true"/>
                                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                        </MultiTrigger.Conditions>
                                        <!--Wenn das Item selected ist und nicht aktiv-->
                                        <Setter Property="Background" Value="Black"/>
                                        <Setter Property="Foreground" Value="Orange"/>
                                    </MultiTrigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>

Es wäre super wenn ihr mir bei der einen oder anderen Fragen helfen könnt.

Vielen Dank.

31.03.2008 - 14:58 Uhr

Hallo ich nutze ein ListView in dem die Elemente in einem WrapPanel angezeigt werden soll.

Die Anzeige soll später ähnlich wie die bekannte "Mininaturansicht" im Windows Explorer aussehen.

In meinem Test, soll die Hintergrundfarbe schwarz und die Textfarbe weiss sein. Das selektierte Elemente soll die Hintergrundfarbe ändern. In meinem Test habe ich dies mit Grün, Rot oder Gelb versucht. Leider funktioniert dies nicht. Bei dem Selektieren wird dies "Windows" Blau. Sobald das ListView den Fokus verliert. Wird der Hintergrund weiss und die Schrift ist dadurch sogar nicht mehr lesbar.

In meinem Test habe ich 3 Varianten probiert, dass sich die Farbe ändert. Ohne Erfolg.
Was habe ich falsch gemacht?

Das ListView ist folgendermassen instanziert.

 <ListView DockPanel.Dock="Top"
                          Style="{StaticResource style_mytest}" 
                          Background="Black">
                </ListView>

Das Style enthält einen eigene Typ. Das Bindung funktioniert wunderbar. Deshalb bitte die Angabe "myType" ignorieren.

<Style x:Key="style_mytest" TargetType="{x:Type ListView}">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="Background" Value="Green" />
            </Trigger>
        </Style.Triggers>
        <Setter Property="FocusVisualStyle">
            <Setter.Value>
                <Style>
                    <Setter Property="Control.Background" Value="Yellow"></Setter>
                </Style>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate DataType="{x:Type myType}">
                    <DataTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="Control.Background" Value="Red" />
                        </Trigger>
                    </DataTemplate.Triggers>
                        <TextBlock TextWrapping="Wrap" Width="150" Text="{Binding Path=ElementContent}" Foreground="White"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel Background="Black">
                    </WrapPanel>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ItemsPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Es wäre super, wenn mir jemand helfen könnte, da ich langsam am verzweifeln bin.

31.03.2008 - 11:31 Uhr

Ok Problem erkannt und gelöst.

Das UserControl hat keinen Hintergrund.

Dadurch scheint es auch für das MouseMove unsichtbar zu sein und nur die Buttons etc. lösen das Event aus.

Ich habe dem UserControl eine Hintergrund"farbe" zugewiesen und nun funktioniert es wunderbar.

Focusable und Focus Scope ist auch nicht relevant.

31.03.2008 - 09:55 Uhr

Nun funktioniert es. Wird nun in die Controls Collection mitaufgenommen.

28.03.2008 - 15:38 Uhr

Ich benötige ein MouseMove Event.
Die Anwendung ist immer im Vollbildmodus, deshalb braucht es nicht einmal Global zu sein.
Ich nutze Windows.Forms mit einem ElementHost in dem ein WPF UC (mit Buttons) gehostet ist.
Nun "überwache" ich das MouseMove Event von dem UC.
Leider wird das Event nur aus ausgelöst, wenn mit der Maus über einen der Buttons gefahren wird.
Die Eigenschaft Focusable habe ich sogar bei dem UC gesetzt. Kein Unterschied

Hat jemand eine Idee an was das liegen kann, oder was ich machen kann?

Vielen Dank
.tim

28.03.2008 - 13:59 Uhr

Ok, für alle die das gleich Problem haben.

Die Sache scheint nur für ein Fenster bzw. Thread zu gelten.
Wenn ihr den Mauszeiger in einem Fenster verstecken wollt, muss dieser Thread auch die Methode ausführen.

Ich invoke aus dem MainForm.

28.03.2008 - 13:50 Uhr

Ich möchte das Thema nochmal ansprechen.

Über 2 Varianten habe ich bereits versucht den Cursor zu verstecken.

Zum einen über System.Windows.Forms.Cursor.Hide()
und andererseits über die Win32 API (ShowCursor user32.dll)

Leider funktioniert keines der Varianten.
Gibt es für den WPF Namensraum auch eine passende Methode dafür oder sollte dort trotzdem auf System.Windows.Forms zugegriffen werden?

28.03.2008 - 11:09 Uhr

Bei der Zuweisung wird keine Exception geworfen.

28.03.2008 - 10:48 Uhr

Hallo ich habe UserControl. Dieses enthält mehrere Controls, wobei ein Control dynamisch geladen werden soll.

Ich möchte gerne folgendermassen vorgehen. Ich instanziiere mein Control, dass ich "includieren" möchte. Dieses weise ich einer Eigenschaft des UserControls zu.

Ich habe u.a. ein ContentControl, Control, UIElement eingebunden und versucht dieses im Code zu ersetzen.

Bei der Zuweisung wird keine Exception geworfen. Das UC enthält aber keine Inhalte.

Wie seit ihr bei sowas vorgegangen? Wie würdet ihr das umsetzen?

28.03.2008 - 10:16 Uhr

Naja, ich bin davon ausgegangen, dass das über Reflections etc geht und somit das Assembly benutzt und keine Unterschiede macht.

Dann ist aber auch die Fehlermeldung falsch. Diese sagt ja aus, dass es nicht in dem Assembly vorhanden ist.

27.03.2008 - 16:39 Uhr

Ich glaube ich habe den Fehler gefunden.

Darf ich wenn ich mich im gleichen Assembly befinde, nicht das Assembly mit angeben?

Gibt es da eine feste Regel?

27.03.2008 - 16:38 Uhr

Ich habe 2 mal die selbe "Fehler"-beschreibung.

Einmal ist es ein Warning, dass beim Schliessen des Designs verschwindet und einmal als Fehler der vorhanden bleibt.

Mein Assemblyname entspricht meinem Namensraum.

Dadurch ergibt sich:
xmlns:MyNamespace="clr-namespace:MyNamespace;assembly=MyNamespace"

Das UserControl instanziiere ich halt mit

<MyNamespace:MyControl></MyNamespace:MyControl>

Wie gesagt, der Designer stellt es auch ordentlich da.

27.03.2008 - 16:14 Uhr

Ich habe die 2008 Pro.
Ist eine RTM (Release/Ready to Manufacturing) Version.

Wie kann man den Fehler beheben oder umgehen?

Wäre super wenn ich mehr Infos darüber bekommen könnte.

Vielen Dank
.tim

27.03.2008 - 15:24 Uhr

Hallo, ich habe in meinem XAML Code einen eigenen Namensraum definiert.

Innerhalb dieses Namensraums ist ein eigenes UserControl vorhanden.

Dieses möchte ich nun einbinden. Der Designer (Visual Studio) zeigt dies sauber an (UserControl im UserControl vorhanden).

Beim Kompilieren, bekomme ich aber einen Fehler, dass der Tag (mein UserControl) nicht in dem Namensraum (mein Namensraum) vorhanden ist.

Ich habe mehrfach überprüft, dass der Namensraum auch so lautet. Das Projekt habe ich vorher auch erfolreich kompiliert. Das UserControl ist aufjeden Fall in dem angebenen Assembly vorhanden.

Sowohl Visual Studio 2005 als auch 2008 melden diesen Fehler.

Habt ihr eine Idee an was das liegen könnte?

Gruss
.tim

27.03.2008 - 12:50 Uhr

Ok ich poste dann mal meinen Code 😉

public partial class SelectElement : UserControl
    {
...
        public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register(
            "Caption", typeof(string), typeof(SelectElement), new PropertyMetadata(false));

        public string Caption
        {
            get { return (Boolean)this.GetValue(CaptionProperty); }
            set { this.SetValue(CaptionProperty, value); }
        }
...}

...
<UserControl.Resources>
        <Style x:Key="btnStyle" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Black"/>
            <Setter Property="BorderThickness" Value="30"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border CornerRadius="10" BorderBrush="BurlyWood" BorderThickness="4" Background="Black">
                            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                                <TextBlock Foreground="BurlyWood" FontSize="42" Name="txt1" TextWrapping="Wrap" Text="{TemplateBinding Button.Content}">
                                    </TextBlock>
                        </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

...

<Button Name="btn1" 
                BorderBrush="BurlyWood" 
                BorderThickness="30"  
                Click="btn1_Click" 
                Style="{StaticResource btnStyle}" 
                FocusVisualStyle="{StaticResource ButtonFocusStyle}">   
    </Button>

Nun möchte ich gerne den Text des Buttons nicht an "Text="{TemplateBinding Button.Content}" binden, sondern an die Eigenschaft CaptionProperty.

Vorher war meine Eigenschaft Caption (string) des UserControls auf die Eigenschaft Content gemapped. Da du aber folgende Bemerkung geäussert hast, würde ich das gerne über diese Lösung korrigieren.

Wobei so ein Binding grob fahrlässig ist da der Content eines Buttons alles mögliche sein kann, und da du das einem String Property zuweist, kann das ganz schön schief gehen.

27.03.2008 - 10:16 Uhr

Danke werde ein DependencyProperty erstellen.

"Genauso"?

Ich erstelle ein Template für den Button, dann Binde ich in dem Template an eine Eigenschaft.

Aber was ist wenn die Eigenschaft ausserhalb des Buttons ist? Hast du bitte ein kurzes Beispiel?

Das BindingTemplate bezieht sich doch nur auf den Button. Soll ich Binding mit Source=this. Path=MeineEigenschaft arbeiten?

Geht das überhaupt?

Wenn ich nun so ein Binding in dem ControlTemplate nutze, und das ControlTemplate als Ressource in einem anderem Control nutze, wie ist dort die Typsicherheit gewährleistet? Da es ja sein könnte, dass das Control die Eigenschaft MeineEigenschaft nicht besitzt?

26.03.2008 - 17:03 Uhr

Also ich habe eine UserControl mit den Namen mein ErweiterterButton.

Diesem UserControl gebe ich eine Eigenschaft nennen wir sie mal DerTextAufDemButton.

Nun möchte ich anstatt den Text von dem TextBlock an Button.Content zu binden, diesen an mein ErweiterterButton.DerTextAufDemButton binden.

Wie kann ich das ordentlich machen?

26.03.2008 - 15:47 Uhr

Ok, nehmen wir an ich habe eine Eigenschaft ausserhalb des Buttons und zwar innerhalb meiner Klasse.

Kann ich innerhalb des Templates an diese Eigenschaft binden?

Nun benötige ich noch Trigger (IsMouseOver etc.).
Bei mir funktioniert es, wenn ich bei dem Trigger das ControlTemplate ändere.
Mir erscheint dies aber eine unsaubere Umsetzung, macht man das so, oder gibt es eine andere/bessere Umsetzung?

Da sich bei meiner jetzigen Optik nur die Eigenschaften der Controls in dem Template ändern, würde ich gerne bei dem Trigger nur diese Eigenschaften ändern.

Wie kann ich die Eigenschaften des Templates per Trigger ändern?

Vielen Dank für die Hilfe.
.tim

26.03.2008 - 15:27 Uhr

@Virussoul

Über die Eigenschaft Content. Bei mir existiert die 😉

Das ControlTemplate werde ich noch als Resource definieren. Oder meintest du etwas anderes mit "rekursiv"?

@talla

Vielen Dank so funktioniert es zwar, aber irgendwie verstehe ich das nicht so recht. Wann Binding und wann TemplateBinding?

In der MSDN steht zu TemplateBinding:

Eine TemplateBinding ist die optimierte Form einer Bindung für Vorlagenszenarios, die einer mit {Binding RelativeSource={RelativeSource TemplatedParent}} erstellten Binding entspricht.

Aber zu TemplatedParent steht da auch nichts mehr weiter.

Nehmen wir an ich erstelle in meiner Klasse eine neue Eigenschaft. Wie kann ich an diese Eigenschaft binden?

Weil TemplateBinding bezieht sich doch auf den Button oder?

26.03.2008 - 13:13 Uhr

Es gibt noch eine andere Möglichkeit, die aber etwas komplizierter ist.
Bei der .exe handelt es sich um ein SFX Archiv. D.h. du kannst die Exe z. B. mit Winrar entpacken. Darin sind viele Dateien enthalten. U. a. auch eine netfx.msi

Da du nun eine MSI-Datei hast, kannst du mit folgendem Befehl das Framework installieren

msiexec.exe /i netfx.msi /quiet /norestart

Der Parameter /norestart verhindert einen Neustart
/quiet sorgt dafür, dass keine Benutzeraktionen benötigt werden.
Alternativ zu /quit kann auch /passive benutzt werden, dabei wird eine Statusleiste angezeigt.

Ich habe es nicht selber getestet. Ich hoffe dir trotzem geholfen zu haben. Vielleicht einfach ein bisschen rumprobieren.

Bzgl. eines Language Packs.
Ich denke bei der langpack.exe handelt es sich auch um eine SFX. D. h. selbes vorgehen und installieren mit dem folgenden Befehl.

msiexec.exe /i langpack.msi /quiet /norestart

Gruss
.tim

26.03.2008 - 12:37 Uhr

Hallo, ich möchte gerne einen Button erstellen.

Für diesen Button habe ich ein Template erstellt. Leider funktioniert das Binding aus irgendeinem Grund nicht.

Folgenden XAML habe ich erstellt:

 <Button Name="btn1" BorderBrush="BurlyWood" BorderThickness="30"  Click="btn1_Click" >   
            <Button.Template>
                <ControlTemplate>
                    <Border CornerRadius="10" BorderBrush="BurlyWood" BorderThickness="4" Background="Black">
                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock Foreground="BurlyWood" FontSize="42" Name="txt1" TextWrapping="Wrap" Text="{Binding Source=btn1, Path=Content}"/>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Button.Template>
    </Button>

Der Button enthält nie Text. Obwohl der Content von Button im Code gefüllt wird. Was mache ich falsch?

25.03.2008 - 14:21 Uhr

Was bitte ist ein Control Part Templete?

25.03.2008 - 11:49 Uhr

Ich habe die Win32API Funktion SetForegroundWindow ausprobiert. Leider schaft diese es auch nicht den Fokus zu ändern.

Meine Anwendung startet eine Fremdsoftware.

Die Fremdsoftware nimmt meiner Anwendung den Fokus.

Meine Anwendung versteckt das Fenster der Fremdsoftware. In der Taskleiste bleibt ein Eintrag noch stehen.

Nun versuche ich meine Anwendung wieder den Fokus zu geben. Ohne Erfolg. Obwohl meine Anwendung maximiert geöffnet wird, hat sich die Taskleiste über die Anwendung gelegt. Der Taskleisteneintrag meiner Anwendung blinkt. Wenn ich nun mit der Maus auf den Eintrag oder das Fenster klicke ist alles ok.

Wie kann ich diesen letzten Schritt automatisieren?

20.03.2008 - 16:09 Uhr

mit this.Focus() funktioniert es eh nicht.

Das scheint nur zu funktionieren wenn die Anwendung bereits den Fokus hat, und man steuern möchte welches Control den Fokus haben soll.

Mir geht es aber darum das die Anwendung den Fokus bekommt. Ds was man z.B. durch Alt+Tab erreichen kann.

Die Timerlösung benötige ich nicht, da ich ja wie beschrieben weiss, wann meine Anwendung den Fokus verliert.

Edit: Form.Activate() funktioniert übrigends auch nicht wirklich gut. Gibt es vielleicht noch etwas?

20.03.2008 - 14:24 Uhr

Danke.

Hast du dazu vielleicht ein Beispiel Link oder Bezug zur MSDN?