Laden...

Forenbeiträge von Fabian E. Ingesamt 258 Beiträge

25.09.2011 - 20:00 Uhr

Hallo,

ich benutze ein ListView mit einem GridView als View.

XAML:


<ListView ItemsSource="{Binding Path=Logs.NormalLog}">
                                    <ListView.View>
                                        <GridView>
                                            <!--Timestamp-->
                                            <GridViewColumn Header="Timestamp"
                                                            Width="Auto">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate DataType="{x:Type M10LogFramework:M10LogMessage}">
                                                        <TextBlock Text="{Binding Timestamp}"
                                                                   Foreground="{Binding LogState,Mode=OneWay,Converter={StaticResource logStateConverter}}" />
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>

                                            <!--Modul-->
                                            <GridViewColumn Header="Modul"
                                                            Width="Auto">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate DataType="{x:Type M10LogFramework:M10LogMessage}">
                                                        <TextBlock Text="{Binding Modul}"
                                                                   Foreground="{Binding LogState,Mode=OneWay,Converter={StaticResource logStateConverter}}" />
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>

                                            <!--Text-->
                                            <GridViewColumn Header="Text" Width="Auto">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate DataType="{x:Type M10LogFramework:M10LogMessage}">
                                                        <TextBlock Text="{Binding Message}"
                                                                   Foreground="{Binding LogState,Mode=OneWay,Converter={StaticResource logStateConverter}}" />
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>

Wie man sieht, habe ich die Width Property der Header auf Auto gesetzt. Beim hinzufügen des ersten Elements zu der ItemsSource passt sich der Header auch wie gewünscht auf die länge des Inhaltes an.
Danach allerdings nicht mehr. Der Header behält die Größe des ersten Elements immer bei.

Manchmal nimmt der header auch nicht die Größe des ersten sondern eines anderen Elements an, allerdings nicht die, des größten...

Wäre es sinnvoll die Width Property des Textblockes an die der GridViewColumn zu binden? Oder gibt es eine offensichtlichere Lösung?

23.09.2011 - 11:18 Uhr

Oh. Na dann werde ich jetzt mal ganz schnell ganz viele DPs umändern 😃 Danke 😃

22.09.2011 - 13:54 Uhr

Okay, also das Ändern von XmlErrors von einer DP zu einer Property mit INotifyPropertyChanged hat geholfen, jetzt klappt es.

Kann mir jetzt vielleicht noch einer erklären, warum es mit einer DP nicht geht? Wäre echt gut zu wissen 😃

22.09.2011 - 13:18 Uhr

Achso, CurrentDocument ist natürlich auch eine DP:

public static readonly DependencyProperty CurrentDocumentProperty =
            DependencyProperty.Register("CurrentDocument", typeof(M10Document), typeof(WorkspaceViewModel), new PropertyMetadata(CurrentDocumentChanged));

Vor dem Aufruf von IntializeComponent() Sind alle Objekte bis Workspace erstellt. Der Rest (CurrentDocument und XMLErrors) ist null.

Workspace ist keine DP, sollte aber auch nicht erforderlich sein, Workspace wechselt nicht und ist vor InitializeComponent() schon vorhanden.

22.09.2011 - 12:06 Uhr

XMLErrors ist eine DependencyProperty.
Definition:

public static readonly DependencyProperty XmlErrorsProperty =
            DependencyProperty.Register("XmlErrors", typeof(ObservableCollection<M10XmlError>), typeof(M10Document));

Macht das in diesem Fall einen Unterschied zu INotify?

22.09.2011 - 11:48 Uhr

Hallo,
ich habe gerade ein kleines Binding Problem.
Folgendes Binding:

<ListView ItemsSource="{Binding Workspace.CurrentDocument.XmlEditorViewModel.XmlErrors}">

Klappt prinzipiell auch, Problem ist allerdings, dass zum Zeitpunkt von InitializeComponent() CurrentDocument == null ist.
Daher kommt kein Binding zustande. Das Output zeigt keine Fehler, trotzdem funktioniert es nicht.
Selbstverständlich soll es nur funktionieren, wenn CurrentDocument NICHT mehr null ist.

Gibt es eine Möglichkeit, dem Control mitzuteilen, dass es sein Binding nochmal 'überprüfen' oder neu erstellen soll?

Oder kann man gar nicht auf etwas binden, das null ist?

21.09.2011 - 10:29 Uhr

Also, ItemsControl + Canvas als ItemsPanel zeigt mir zumindest mal das oberste Element an.
Allerdings auch NUR das oberste Element. Alle CHilds werden trotz HierarchicalDataTemplate und gesetzter ItemsSource ignoriert. Ich denke ein normales ItemsControl kann villeicht mit einem HierarchicalDataTemplate nichts anfangen?

Alternativ könnte ich natürlich auch die Hierachie über den haufen werfen und per Hand für jedes Element im Code ein Image erstellen und hinzufügen. Super schön wäre das allerdings nicht...

Hier mein bisheriges XAML:


<ItemsControl Margin="2"
                          Width="400"
                          Height="400"
                          HorizontalAlignment="Center"
                          VerticalAlignment="Center"
                          DataContext="{Binding ElementName=dockWindow}"
                          ItemsSource="{Binding FileViewModel.Scenes}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas HorizontalAlignment="Stretch"
                                VerticalAlignment="Stretch" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type FxViewModels:FxSceneObjectViewModel}"
                                              ItemsSource="{Binding Childs}">
                        <Rectangle Width="{Binding ID}"
                                   Height="30"
                                   Fill="AliceBlue"/>
                    </HierarchicalDataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Width des Rectangle ist auf ID gebunden, damit ich feststellen kann, ob mehrere Rectangles angezeigt werden.

20.09.2011 - 22:26 Uhr

Wäre es vielleicht möglich das gnaze über eine Listbox mit einem Canvas als ItemsPanel zu lösen? Das sollte doch dann alle Elemente genau übereinander zeichnen, oder?

Eigentlich benötige ich ein Stackpanel, das in Z-Richtung stapelt 😃

20.09.2011 - 22:13 Uhr

Also direkt als XAML geht nicht, konvertieren klingt aber interessant. Werde mich da mal etwas schlau machen.

Um das ganz etwas weniger abstract zu machen hier mal ein kleiner Ausschnitt aus dem XML:


<FxContainer Name="Screen">
      <Properties>
        <Property Name="Name">
          <String>Screen</String>
        </Property>
        <Property Name="Visible">
          <Bool>True</Bool>
        </Property>
        <Property Name="Top">
          <Float>-1</Float>
        </Property>
        <Property Name="ID">
          <Int>-1</Int>
        </Property>
        <Property Name="Position">
          <Array>
            <Float>0</Float>
            <Float>0</Float>
            <Float>0</Float>
          </Array>
        </Property>
        <Property Name="CenterScale">
          <Array>
            <Float>1</Float>
            <Float>1</Float>
            <Float>1</Float>
          </Array>
        </Property>
        <Property Name="Opacity">
          <Float>1</Float>
        </Property>
        <Property Name="Offset">
          <Array>
            <Float>0</Float>
            <Float>0</Float>
            <Float>0</Float>
          </Array>
        </Property>
        <Property Name="Scale">
          <Array>
            <Float>1</Float>
            <Float>1</Float>
            <Float>1</Float>
          </Array>
        </Property>
        <Property Name="Size">
          <Array>
            <Int>470</Int>
            <Int>800</Int>
          </Array>
        </Property>
      </Properties>
      <Scenes>
        <FxContainer Name="folder">
          <Properties>
            <Property Name="Name">
              <String>folder</String>
            </Property>
            <Property Name="Visible">
              <Bool>True</Bool>
            </Property>
            <Property Name="Top">
              <Float>0</Float>
            </Property>
            <Property Name="ID">
              <Int>0</Int>
            </Property>
            <Property Name="Position">
              <Array>
                <Float>235</Float>
                <Float>400</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="CenterScale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Opacity">
              <Float>1</Float>
            </Property>
            <Property Name="Offset">
              <Array>
                <Float>-235</Float>
                <Float>-327</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="Scale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Size">
              <Array>
                <Int>470</Int>
                <Int>654</Int>
              </Array>
            </Property>
          </Properties>
          <Scenes />
        </FxContainer>
        <FxContainer Name="DropArea">
          <Properties>
            <Property Name="Name">
              <String>DropArea</String>
            </Property>
            <Property Name="Visible">
              <Bool>True</Bool>
            </Property>
            <Property Name="Top">
              <Float>0</Float>
            </Property>
            <Property Name="ID">
              <Int>1</Int>
            </Property>
            <Property Name="Position">
              <Array>
                <Float>235</Float>
                <Float>400</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="CenterScale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Opacity">
              <Float>1</Float>
            </Property>
            <Property Name="Offset">
              <Array>
                <Float>-265</Float>
                <Float>-374</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="Scale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Size">
              <Array>
                <Int>470</Int>
                <Int>654</Int>
              </Array>
            </Property>
          </Properties>
          <Scenes />
        </FxContainer>
        <FxContainer Name="item">
          <Properties>
            <Property Name="Name">
              <String>item</String>
            </Property>
            <Property Name="Visible">
              <Bool>True</Bool>
            </Property>
            <Property Name="Top">
              <Float>0</Float>
            </Property>
            <Property Name="ID">
              <Int>2</Int>
            </Property>
            <Property Name="Position">
              <Array>
                <Float>235</Float>
                <Float>400</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="CenterScale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Opacity">
              <Float>1</Float>
            </Property>
            <Property Name="Offset">
              <Array>
                <Float>-235</Float>
                <Float>-327</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="Scale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Size">
              <Array>
                <Int>470</Int>
                <Int>654</Int>
              </Array>
            </Property>
          </Properties>
          <Scenes />
        </FxContainer>
        <FxContainer Name="timeline.Tip_Bubbles_Main">
          <Properties>
            <Property Name="Name">
              <String>timeline.Tip_Bubbles_Main</String>
            </Property>
            <Property Name="Visible">
              <Bool>True</Bool>
            </Property>
            <Property Name="Top">
              <Float>0</Float>
            </Property>
            <Property Name="ID">
              <Int>3</Int>
            </Property>
            <Property Name="Position">
              <Array>
                <Float>265</Float>
                <Float>480</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="CenterScale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Opacity">
              <Float>1</Float>
            </Property>
            <Property Name="Offset">
              <Array>
                <Float>-265</Float>
                <Float>-480</Float>
                <Float>0</Float>
              </Array>
            </Property>
            <Property Name="Scale">
              <Array>
                <Float>1</Float>
                <Float>1</Float>
                <Float>1</Float>
              </Array>
            </Property>
            <Property Name="Size">
              <Array>
                <Int>530</Int>
                <Int>960</Int>
              </Array>
            </Property>
          </Properties>
          <Scenes>
            <FxContainer Name="hitbox.Tip_bubbles_01">
              <Properties>
                <Property Name="Name">
                  <String>hitbox.Tip_bubbles_01</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>0</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>10</Float>
                    <Float>300</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>5.1</Float>
                    <Float>1.1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Opacity">
                  <Float>1</Float>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>0</Float>
                    <Float>-30</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
              </Properties>
              <Scenes />
            </FxContainer>
            <FxContainer Name="text.label_01">
              <Properties>
                <Property Name="Name">
                  <String>text.label_01</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>1</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>235</Float>
                    <Float>310</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>0.9</Float>
                    <Float>0.9</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>0</Float>
                    <Float>-10</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>                
              </Properties>
              <Scenes />
            </FxContainer>
            <FxContainer Name="message_no_arrow.9.png">
              <Properties>
                <Property Name="Name">
                  <String>message_no_arrow.9.png</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>2</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>235</Float>
                    <Float>300</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>4.2</Float>
                    <Float>0.9649122</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>-57</Float>
                    <Float>-57</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
              </Properties>
              <Scenes />
            </FxContainer>
            <FxContainer Name="hitbox.Tip_bubbles_02">
              <Properties>
                <Property Name="Name">
                  <String>hitbox.Tip_bubbles_02</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>3</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>10</Float>
                    <Float>690</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>5.1</Float>
                    <Float>1.35</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Opacity">
                  <Float>1</Float>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>0</Float>
                    <Float>-20</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
              </Properties>
              <Scenes />
            </FxContainer>
            <FxContainer Name="text.label_02">
              <Properties>
                <Property Name="Name">
                  <String>text.label_02</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>4</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>228</Float>
                    <Float>680</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>0.9</Float>
                    <Float>0.9</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>0</Float>
                    <Float>0</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
              </Properties>
              <Scenes />
            </FxContainer>
            <FxContainer Name="message_port_bottom_cps.9.png">
              <Properties>
                <Property Name="Name">
                  <String>message_port_bottom_cps.9.png</String>
                </Property>
                <Property Name="Visible">
                  <Bool>True</Bool>
                </Property>
                <Property Name="Top">
                  <Float>0</Float>
                </Property>
                <Property Name="ID">
                  <Int>5</Int>
                </Property>
                <Property Name="Position">
                  <Array>
                    <Float>235</Float>
                    <Float>690</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="CenterScale">
                  <Array>
                    <Float>3.152</Float>
                    <Float>1.323529</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
                <Property Name="Offset">
                  <Array>
                    <Float>-74</Float>
                    <Float>-51</Float>
                    <Float>0</Float>
                  </Array>
                </Property>
                <Property Name="Scale">
                  <Array>
                    <Float>1</Float>
                    <Float>1</Float>
                    <Float>1</Float>
                  </Array>
                </Property>
              </Properties>
              <Scenes />
            </FxContainer>
          </Scenes>
        </FxContainer>
      </Scenes>
    </FxContainer>

Damit das ganze nicht zu verwirrend wird, hier noch ein Screenshot von der Struktur (wird so in meinem Programm angezeigt)

Jedes in dem Screenshot angezeigtes Element soll nachher via einem Image gezeichnet werden. Ich benötige nur ein Control welches mir diese Struktur über DataTemplates verwandeln kann. Problem ist dabei aber eben, dass alle Images die selben Ursprungskoordinaten haben sollten.

20.09.2011 - 21:30 Uhr

Hallo,

leider ist mir kein beserer Titel für mein Problem eingefallen...

Folgendes Szenario: Ich habe eine XML-Datei. In dieser XML-Datei wird eine UI mit einer Baumstruktur beschrieben. (Ähnlich zu XAML)

Diese XML wird eingelsen und verarbeitet (zu hierachischen Objekten).
Nun würde ich gerne diese UI Struktur auch grafisch darstellen.
Alle Elemente der UI sollen nur als Rechtecke bzw. als Images dargestellt werden.

Nun bräuchte ich irgendeine Art Control welches über ItemsSource ein HierarchicalDataTemplate mit eigener ItemsSource darstellt. Allerdings müssen eben alle Childs die selben Ursprungskoordinaten besitzen.
Ich muss quasi die Möglichkeit besitzen, alle Childs exakt übereinander zu zeichnen, falls das nötig sein sollte.

Wichtig wäre eben, dass die hierachische Struktur erhalten bleibt und ich theoretisch jedes UI Element anklicken kann (Manche wäre natürlich von anderen verdeckt)

Ich hoffe irgendjemand versteht das jetzt so, wie ich das meine...

07.06.2011 - 13:58 Uhr

Du kannst, falls Updates gefunden werden, jedes einzeln durchgehen und irgendwas damit anstellen.
Du musst auch nicht diesen vorgefertigten Updateweg benutzen, du könntest prinzipiell auch eine eigene GUI dafür schreiben und nur die Daten des Controllers benutzen.
Sollte zumindest so klappen.

27.05.2011 - 11:18 Uhr

Hallo,
ich habe zuzeit folgendes Problem: In einem Window mit einer Ribbonbar möchte ich mir Office-like Groupboxes für den Backstage-Bereich erstellen.
das mache ich über ein Template für die normale Groupbox.
Hier der Code dazu:

<Style x:Key="BackStageGroupStyle"
               TargetType="{x:Type GroupBox}">
            <Setter Property="HorizontalAlignment"
                    Value="Left" />
            <Setter Property="VerticalAlignment"
                    Value="Top" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>

                            <Label Grid.Column="0"
                                   Grid.ColumnSpan="2"
                                   Content="{TemplateBinding Header}"
                                   FontWeight="Bold"
                                   FontSize="14.667"
                                   Foreground="#FF4D4D4D"
                                   HorizontalAlignment="Left" />
                            <Line Grid.Row="1"
                                  StrokeThickness="0.5"
                                  StrokeDashArray="6,4"
                                  Stroke="#FF414141"
                                  Margin="0,0,0,10"
                                  Grid.Column="0"
                                  Grid.ColumnSpan="2"
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                  X1="{Binding RelativeSource={RelativeSource Mode=Self},Path=ActualWidth}" />
                            <ContentPresenter Grid.Column="1"
                                              Grid.Row="2"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                              Margin="15,0,0,0" />
                            <Line Grid.Column="3"
                                  Grid.Row="0"
                                  Grid.RowSpan="3"
                                  StrokeThickness="0.1"
                                  Y1="{Binding RelativeSource={RelativeSource Mode=Self},Path=ActualHeight}"
                                  Margin="6,0,12,0">
                                <Line.Stroke>
                                    <LinearGradientBrush EndPoint="0.5,1"
                                                         StartPoint="0.5,0">
                                        <GradientStop Color="#00838383"
                                                      Offset="0" />
                                        <GradientStop Color="#00BCBCBC"
                                                      Offset="1" />
                                        <GradientStop Color="#FF292929"
                                                      Offset="0.057" />
                                        <GradientStop Color="#FF313131"
                                                      Offset="0.948" />
                                    </LinearGradientBrush>
                                </Line.Stroke>
                            </Line>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Das sieht auch schon ganz gut aus so. Ein Problem habe ich allerdings.
Wenn ich nun eine Groupbox mit diesem Style in ein Grid packe (zusammen mit ein paar anderen) und HorizontalAlignment auf "Stretch" stelle, dann stretched er mir die Groupbox über das ganze Window und interessiert sich nicht für die Größe des Grids.

Entferne ich den Style dann verählt sich die Groupbox genau wie erwartet. Sie wird genau so groß, dass sie die ganze Zelle ausfüllt, vergrößert sie aber nicht.

Wie kann ich dieses Verhalten bei meinem Style erreichen?

25.05.2011 - 12:24 Uhr

Okay, dumme Frage, ich habe den Updater gerade nicht hier, wie stellt man die Sprache um? Eine einfache Property?

Englisch reicht mir 😃

24.05.2011 - 10:34 Uhr

Sag mal, kann ich eigentlich die Sprache des Updaters ändern? Oder eigene Übersetzungsdlls mitgeben?

23.05.2011 - 00:57 Uhr

Es gibt einfach so Tage, da fallen einem die passenden Suchbegriffe nicht ein... 😦

Hast du direkt bei codeproject gesucht? Oder bei Google?

Aber vielen Dank schonmal! 😃

23.05.2011 - 00:45 Uhr

Nein, kein OpenFileDialog 😉
Ehrlich gesagt ist es mir egal, WIE das ganze angezeigt wird. Hauptsache der User kann das Programm auswählen.

Das Auslesen ist leider nicht ganz so einfach, jedenfalls war es vor ein-zwei Jahren nicht.
Die Programme sind über die ganze Registry verteilt. Teilweise noch mit GUIDs codiert etc.

Habe mich damit mal länger befasst, das auszulesen, damals waren da doch einige eigene Klassen involviert 😉
Vielleicht war ich aber auch einfach zu blöd. 😃

23.05.2011 - 00:33 Uhr

Hallo,
mich würde interessieren, ob es eine Mögichkeit gibt, den "Öffnen mit"-Dialog vom Windows Explorer irgendwie von außen anzeigen zu lassen.

Habe im Internet leider so gut wie gar nichts dazu gefunden, über Commandline Arguments scheint es nicht zu gehen.

Kann man das irgendwie anders lösen? (Außer selbst zu schreiben natürlich)
Gäbe es zur Not halbwegs vernünftige API-Funktionen, die mir die registrierten "Öffnen mit"-Programme ausgeben?
Oder müsste ich mir die wirklich per Hand in der Registry zusammen suchen?

13.05.2011 - 14:44 Uhr

Vielen Dank, mit IDataErrorInfo klappt das sehr gut! 😃

13.05.2011 - 14:26 Uhr

Hallo,
ich habe folgenden Code:

<TextBox Grid.Row="2"
                                         Grid.Column="1"
                                         x:Name="tbxZipalignPath"
                                         Margin="2">
                                    <TextBox.Text>
                                        <Binding Path="ZipalignPath"
                                                 UpdateSourceTrigger="PropertyChanged"
                                                 ValidatesOnExceptions="True" >
                                            <Binding.ValidationRules>
                                                <ViewModel:FilePathValidationRule />
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                                </TextBox>

Dieser sorgt dafür, dass der Text der in die Textbox geschrieben wird, immer ein gültiger Pfad sein muss.
Das klappt soweit auch schon genau wie ich das möchte. Allerdings bekommt diese Textbox über das Binding beim Start der Anwendung direkt etwas zugewiesen.
Der Wert dieser Zuweisung wird allerdings nicht überprüft. Der text steht danach in der Textbox wie es sein soll, allerdings erkennt er dann eventuell vorhandene Fehler nicht.

Gibt es eine Möglichkeit dieses Verhalten zu ermöglichen?

PS: Wie schaffe ich es eigentlich, dass formatiereter Code hier richtig dargestellt wird? Also nicht so fies versetzt.

13.05.2011 - 14:13 Uhr

Du könntest auch mal UpdateSourceTrigger auf "LostFocus" stellen.

29.04.2011 - 14:07 Uhr

Hallo,
ich habe gerade ein etwas blödes Problem.
Ich habe eine Listbox, die im Selectionchanged Event etwas Code ausführt.
In diesem Code wird unter anderem einer Textbox ein Text zugewiesen.
Dadurch wird die Selection der Listbox aber leider nicht angezeigt. Klicke ich ein weiteres mal auf den Eintrag (Text der Textbox bekommt den selben Wert wie vorher zugewiesen, ändert den Text also nicht) dann klappt alles.

Im Prinzip geht es immer dann, wenn sich der Text der Textbox nicht ändert.
Ändert er sich, dann wird die Selection nicht angezeigt, sehr wohl aber intern durchgeführt. Die geschmissenen Events stimmen alle.

Gibt es für dieses Problem eine Lösung?

27.04.2011 - 21:42 Uhr

Hallo,

ich habe im Moment folgendes Problem: Je nach einem gegebenen String möchte ich eine Liste mit einer neuen Instanz einer generischen Klasse füllen.
Die scheitert allerdings daran, dass ich nicht anhand des strings den Typ der generischen Klasse bestimmen kann.

Folgender Code scheitert aus logischen Gründen:


M10Property<M10BaseType> property = null;
                                switch (dataType)
                                {
                                    case "String":
                                        property = new M10Property<M10String>(new M10String());
                                        break;
                                }

Gibt es überhaupt eine Möglichkeit irgendwie anhand dieses Strings (er kommt aus einer XML-Datei und beinhaltet eben Sachen wie Int, String, Float2, Float3 etc) zu entscheiden, welchen Typ nun meine generische Klasse übergeben bekommt?

EDIT: Was genau bekommt so eine generische Klasse eigentlich übergeben? Ist ja quasi ein Klassenname... Gibt es dafür einen Typ?

08.04.2011 - 08:56 Uhr

Hast du vollkommen Recht, ändere den Fehlertext und du hast wieder das was bei mir steht, stammt aus zwei verschiedenen Versionen, ich habe etwas rumprobiert woran es liegen könnte.
Egal welche Property ich nehme, der Fehler bleibt der gleiche. (auf die akteulle Property bezogen)

Das scheint wohl auch ein bekanntes Problem in WPF zu sein, dieser Data Error 4.
Allerdings hatte das sonst eben keine Auswirkungen auf die Funktion und man solle den Fehler einfach ignorieren...
Hat wohl was mit ItemControls und ItemsSource zu tun oder so, ich suche noch mal den Link.

EDIT: Gefunden: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/564e7160-df70-4e95-945d-60954dd7a2ae

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8028a46b-3080-40ad-aed2-e9417eb25381

07.04.2011 - 23:04 Uhr

Sorry, ich meine natürlich diesen hier:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cbxPortName'. BindingExpression:Path=SelectedIndex; DataItem=null; target element is 'Button' (Name=''); target property is 'CommandParameter' (type 'Object')

EDIT: Fehlermeldung korrigiert.

07.04.2011 - 19:51 Uhr

Hallo,
habe gerade ein seltsames Problem: Mein stinknormales Control Binding will einfach nicht klappen.
Und zwar möchte ich das SelectedItem einer ComboBox auf den CommandParameter eines Buttons binden.
Das klappt leider nicht, es kommt der Fehler 4.
Da meine Combox per ItemsSource befüllt wird, scheint der Fehler ja erst mal in WPF selbst zu liegen (bekanntes Problem),
die ganzen Schilderungen im Internet haben aber kein Problem damit, dass das Binding dann überhaupt nicht kalppt.

Hier der Code:


<StackPanel DockPanel.Dock="Top"
                            Orientation="Horizontal">
                    <StackPanel.Resources>
                        <ObjectDataProvider x:Key="PortNames"
                                            ObjectType="{x:Type Ports:SerialPort}"
                                            MethodName="GetPortNames" />
                    </StackPanel.Resources>
                    <ComboBox x:Name="cbxPortName"
                              Margin="2"
                              DockPanel.Dock="Top"
                              ItemsSource="{Binding Source={StaticResource PortNames}}"
                              Text="Port Auswahl"
                              SelectedIndex="0" />

                    <Button Margin="2"
                            DockPanel.Dock="Top"
                            Content="Verbinden"
                            CommandParameter="{Binding ElementName=cbxPortName,Path=SelectedIndex,Mode=OneWay}"
                            Command="{Binding Source={x:Static CommandBridge:GUICommands.Firmware}, Path=InitializeFlashLibrary}" />
                </StackPanel>

Ist es wirklich schon so spät, dass ich irgendwas dummes übersehe? Als Parameter kommt immer "null" an...

07.04.2011 - 17:41 Uhr

Okay, das klingt ja schonmal sinnvoll.
Nur wie komme ich an diesen "Button" und dessen Click-Event ran?

Kleine Zwischenfrage, Ziel des ganzen ist es, nach dem Klick einen anderen MenuButton auszuklappen.
Über das Event ist das sehr einfach, geht das auch per XAML? Bestimmt oder?

private void TestGalleryButton_Click()
        {
            btnTestResult.IsDropDownOpen = true;
        }
07.04.2011 - 16:13 Uhr

Hallo,
ich beschäftige mich gerade näher mit den ganzen neuen Events in WPF und den neuen Ideen die dahinter stecken.

Das ganze verwirrt mich aber ein wenig... Ich kann nämlich nicht wirklich begreifen, wann bei welchen COntrol ein Event gefeuert wird.

Hier erst mal der Code:
UserControl:


<UserControl x:Class="RP6_Remotrol.GUI.CustomControls.TestGalleryButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:CustomControls="clr-namespace:RP6_Remotrol.GUI.CustomControls"
             Width="Auto"
             Height="Auto"
             MaxHeight="60"
             MaxWidth="60"
             MouseDown="UserControl_MouseDown"
             Background="Transparent"
             IsHitTestVisible="true"
             MouseUp="UserControl_MouseUp"
             PreviewMouseUp="UserControl_PreviewMouseUp">
    <Viewbox MouseUp="Viewbox_MouseUp"
             PreviewMouseUp="Viewbox_PreviewMouseUp">
        <StackPanel Orientation="Vertical"
                    MouseUp="StackPanel_MouseUp"
                    PreviewMouseUp="StackPanel_PreviewMouseUp">
            <Image Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type CustomControls:TestGalleryButton}}, Path=Image}"
                   MouseUp="Image_MouseUp"
                   PreviewMouseUp="Image_PreviewMouseUp" />
            <Label HorizontalContentAlignment="Center"
                   Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type CustomControls:TestGalleryButton}}, Path=Header}"
                   MouseUp="Label_MouseUp"
                   PreviewMouseUp="Label_PreviewMouseUp" />
        </StackPanel>
    </Viewbox>
</UserControl>

Dann die entsprechende Verwendung:


<r:RibbonGroup x:Name="grpTests"
                               Header="Selbsttest">
                    <r:RibbonGroup.Resources>
                        <ResourceDictionary>
                            <DataTemplate x:Key="testButtonTemplate">
                                <CustomControls:TestGalleryButton Header="{Binding Name}"
                                                                  Image="{Binding Image}"
                                                                  CommandParameter="{Binding TestCode}"
                                                                  Command="{x:Static cmd:GUICommands.StartTest}"
                                                                  Click="TestGalleryButton_Click" />
                            </DataTemplate>
                        </ResourceDictionary>
                    </r:RibbonGroup.Resources>
                    <r:RibbonMenuButton x:Name="btnSelfTest"
                                        Label="Test starten"
                                        LargeImageSource="Images\Large\startTest.png"
                                        IsEnabled="{Binding Source={x:Static ContentBridge:PropertyManager.RP6Status},Path=RP6Available}">

                        <r:RibbonGallery DataContext="{x:Static ContentBridge:PropertyManager.TestProperties}"
                                         PreviewMouseUp="RibbonGallery_PreviewMouseUp"
                                         MouseUp="RibbonGallery_MouseUp">
                            <r:RibbonGalleryCategory ItemsSource="{Binding TestsRP6}"
                                                     ItemTemplate="{StaticResource testButtonTemplate}"
                                                     Header="RP6"
                                                     MouseUp="RibbonGalleryCategory_MouseUp"
                                                     PreviewMouseUp="RibbonGalleryCategory_PreviewMouseUp"
                                                     MinColumnCount="4" />
                            <r:RibbonGalleryCategory ItemsSource="{Binding TestsM32}"
                                                     ItemTemplate="{StaticResource testButtonTemplate}"
                                                     Header="M32"
                                                     MinColumnCount="4" />
                            <r:RibbonGalleryCategory ItemsSource="{Binding TestsM128}"
                                                     ItemTemplate="{StaticResource testButtonTemplate}"
                                                     Header="M128"
                                                     MinColumnCount="4" />
                        </r:RibbonGallery>
                    </r:RibbonMenuButton>
                </r:RibbonGroup>

Wie man sehen kann habe ich zum Testen mal an so ziemlich allen möglichen Stellen die Events für MouseUp eingefügt.

Nun würde mich interessieren warum von all diesen Events NUR das bei der RibbonGallery und das bei der RibbonGalleryCategory gefeuert wird. Das sind beides die PreviewEvents. Auch in der richtigen Reihenfolge.

Wo werden denn all die anderen Events abgefangen und geblockt?

Achja, das MouseDown des UserControls kommt sauber, ich brauche aber eben auch das Up.
Prinzipiell könnte ich so jetzt damit arbeiten, aber komisch finde ich es trotzdem.

Liebe Grüße,
Fabian

05.04.2011 - 11:39 Uhr

Hallo,

ich stehe gerade vor dem Problem, eine Animation zu verändern, während sie läuft.

Folgendes Szenario: Ich habe einen Zeiger (im grafischen Sinne) der animiert werden soll (-->eine Gauge).
Das klappt ja über eine DoubleAnimation auch ganz wunderbar.
Allerdings gibt es ein Problem, wenn die Gauge einen neuen Wert annehmen soll, bevor die Animation zu dem alten Wert fertig ist.

Dann wird nämlich eine neue Animation erzeugt und der Zeiger springt von der aktuellen Position der alten Animation zu der Startposition der neuen Animation. danach geht es natürlich flüssig weiter.

Ich habe das ganze auch schon auf anderem Wege versucht (Ansatz aus Winforms, mit Timer, der das ganze animiert), dabei habe ich allerdings Probleme mit Multithreading und den DependencyProperties, was dann in der Folge zu massiven Performanceeinbußen beim Synchronisieren der Threads (GUI-Thread und Timer-Thread) führt.
Aber immerhin klappt es dann so wie ich das will.

Daher nun auch meine Frage: Gibt es eine Möglichkeit, eine laufende Animation so zu verändern, dass sie flüssig weiter läuft, auch wenn sich quasi die "Richtiung" ändert? Kann ich irgendwie den aktuellen Wert der Animation sauber abgreifen?
Direkt über die zu animierende DP?

05.04.2011 - 00:06 Uhr

Okay, vielen Dank, das dachte ich mir so schon. 😃

04.04.2011 - 19:37 Uhr

Hallo,
ich habe gerade als WPF Anfänger das Interface INotifyPropertyChanged entdeckt und für sehr praktisch befunden.

Gibt es irgendwelche Einwände dagegen es statt DependencyProperties zu verwenden, wenn man die zusätzlichen Möglichkeiten der DPs nicht braucht?

02.04.2011 - 16:36 Uhr

Ach, das Portieren von Projekten nach WPF ist schon ein Kampf 😉
Immer muss man komplett umdenken...
In diesem Fall ist das nämlich nicht so einfach möglich, der Slider ist derjenige, der die Daten bereitstellt.
Ich verarbeite die dann nur weiter. Und deshalb wurde unter WinForms eben einfach eine Methode mit dem aktuellen Wert aufgerufen. -->Keine Daten vorhanden, die ich an den Slider binden könnte.

Die saubere Lösung wäre also dann mir irgendwo eine DP zu erstellen, im OnChange der DP dann meine eigene Methode aufrufen und dann glücklich sein, dass der zweite Slider auch den passenden Wert hat?

Wenn eine einfachere Lösung wirklich so falsch ist, dann werde ich das natürlich so machen...

Aber danke schonmal für den Tipp 😃 Die Arbeit ist es wert, ich war noch nie von einer neuen Technologie so begeistert, wie von WPF 😃 Okay, die neuen Tasks unter .NET 4 sind auch echt cool 😃

02.04.2011 - 15:01 Uhr

Hallo,
ich habe mir ein UserControl geschrieben, mit in diesem Fall ein paar Slidern drauf.

Dieses UserControl wird als einziges Child in einem Window angezeigt und zusätzlich (deswegen auch ein UserControl) noch als DropDown in einem RibbonSplitButton.

Das klappt auch alles soweit super. Nun würde ich aber gerne den Wert der Slider über die beiden Instanzen dieses UserControls synchronisieren.

Dazu habe ich eine DependencyProperty im UserControl angelegt um diesen Wert zu speichern, um dann aber festzustellen, dass der Wert natürlich NICHT synchronisiert wird.
Das wäre ja auch total sinnlos.

Daher meine Frage, kann man entweder eine DP irgendwie richtig statisch machen (ein Wert pro Klasse) oder gibt es sonst irgendeinen Weg, automatisch Werte über Instanzen zu synchronisieren?

Liebe Grüße,
Fabian

02.04.2011 - 12:55 Uhr

Okay, ehrlich gesagt reagiert der SpiltButton gar nicht auf mein Command...
Der ButtonTeil ist IMMER deaktiviert, egal was CanExecute zurückliefert. Beim SplitTeil ist es genau anders herum. Der ist immer aktiviert.
Das lässt sich scheinbar nur über IsEnabled steuern?

EDIT: Also aktivieren geht jetzt, der SplitButton verhält sich bei der Übergabe des CommandParameters anders als der normale RibbonButton, daher ließ er sich nicht aktivieren.
Komplettes Deaktivieren geht aber nach wie vor nicht.

EDIT2: Ich habe es jetzt gelöst, oder besser gesagt umschifft...
Da ich eine eigene Commad-Klasse hab, konnte ich dort eine Property IsEnabled einbauen, die das Ergebnis von CanExecute zurück liefert.
Diese Property habe ich dann auf IsEnabled vom SplitButton gebunden.
Das klappt soweit und ist auch fast schon sauber gelöst 😉

01.04.2011 - 23:02 Uhr

Naja, bei mir nicht... Habe eben aber auch Mist erzählt... 😦 Ich mache das über ein Command und nicht über IsEnabled...
Gibt es also eine Möglichkeit, IsEnabled auf das Enabled vom Command zu binden?


<r:RibbonSplitButton x:Name="btnMicrophone"
                                    LargeImageSource="Images\Large\mikrofon.png"
                                    Label="Mikrofon"                                          
                                    CommandParameter="{x:Static cmd:Windows.Microphone}"
                                    Command="{x:Static cmd:GUICommands.OpenForm}">
                        <WindowControls:MicrophoneControl/>
                        <r:RibbonMenuItem Header="Fenster öffnen"/>
                    </r:RibbonSplitButton>
01.04.2011 - 22:06 Uhr

Hallo,
ich stehe gerade vor dem Problem, einen RibbonSplitButton komplett zu deaktivieren.
Die Eigenschaft IsEnabled gilt leider nur für den oberen Teil des Buttons. Der DropDown-Teil bleibt aktiv.
Ich möchte aber alles deaktivieren. Gibt es eine Lösung hierfür?

31.03.2011 - 09:44 Uhr

So, das klappt ja jetzt schon alles super, ich habe es am Anfang natürlich auch viel zu kompliziert gemacht, wenn man das dann aber mal verstanden hat, gehts gut.

Das mit dem Kontextmenü verstehe ich noch nicht ganz. Ich fände es schön, wenn die ViewModels das selbst erzeugen würden.
Allerdings weiß ich nicht, wo genau ich dann quasi die Zuweisung habe, dass das Item auch das Menü benutzt.

Irgendwo muss ich ja dem TreeView noch mitteilen, dass dieses Item jenes Contextmenü haben möchte, oder?
Ich hätte angenommen, dass man das im DataTemplate macht, aber dort finde ich nichts...

Okay, Lösung gefunden, Ich muss natürlich das ContextMenu bei dem Control IN dem DataTemplate festlegen, nicht bei dem Template selbst.

28.03.2011 - 11:17 Uhr

Perfekt! 😃 Das klappt jetzt schonmal so, wie ich mir das vorstelle. 😃

Eine Frage noch, ich möchte jetzt noch ein ContextMenu anzeigen (--> kein Problem) möchte aber dann auch darauf reagieren können, auf welches Item geklickt wurde.
Ich brauche also irgendwie Zugriff auf das ViewModel hinter dem Item über das ContextMenu. Ist das auch möglich?

28.03.2011 - 09:57 Uhr

Wow, super, vielen Dank! Ich denke, damit kann ich etwas anfangen. 😃

Und das TreeView nimmt sich jetzt selbstständig die Templates? Bzw. natürlich macht es das, aber warum genau?
Ist das immer so, wenn man einen DataType festlegt? Für welche Controls gilt das? ItemControls?

Theoretisch müsste man jetzt noch die Datenhaltung von den einzelnen Itemklassen trennen, oder?

28.03.2011 - 09:22 Uhr

Prinzipiell geht es darum, dass Dateien repräsentiert werden.

Diese Dateien werden in verschiedene Unterknoten aufgeteilt. An einem bestimmten Punkt ist ein Unterknoten allerdings wieder so eine Datei und
man ist von der Logik quasi wieder in der ersten Ebene und alles geht von vorne los.

So kann man sich quasi beliebig weit durch den Baum klicken.
Stell es dir als eine Art Klassen-Browser vor, der dir anzeigt, welche Klassen welche Methoden verwenden.
Wenn man so eine "Methode" ausklappt landet man wieder in der Klasse,
in der die Methode definiert ist und kann sich dann weitere Methoden aus der Klasse anzeigen lassen.

Prinzip verstanden? Ich kanns nicht gut erklären, ist aber eigentlich recht simpel.
Und da eben nunmal unendlich viele Referenzen aufeinander vorhanden sind, muss ich den Baum dynamisch aufbauen.

Beispiel: Klasse1 hat eine Methode abc. Diese Methode ruft Methode xyz von Klasse2 auf.
xyz aus Klasse2 ruft aber nun wiederum evntuell abc aus Klasse1 auf.
Genau das visualisiere ich hier. Natürlich etwas komplexer, aber vom Prinzip her stimmt das so.

Leider gibt es aber jetzt eben z.B nicht nur Methoden sondern auch noch andere Arten solcher Daten,
die angezeigt werden (im Screenshot eben Activate, Run, M!GF_Activate und M1GF_Run)

Vielen Dank schonmal, dass du dir so viel Mühe machst 😃

28.03.2011 - 08:15 Uhr

Okay, das macht Sinn. Ich könnte nun also statt mir eine neue Klasse zu basteln, einfach meine Liste mit Datenobjekten verwenden und über das ItemTemplate selbst festlegen wie das dann dargestellt wird. Das klingt schon mehr nach WPF 😉

Allerdings habe ich ein Problem: Die Struktur des TreeViews ist dynamisch, d.h. ich kann zur Designzeit nicht sagen, wie viele Ebenen es geben wird.
Zum besseren Verständnis hänge ich mal einen Screenshot der WinForms-Version an.

Da kann ich mir gerade noch nicht vorstellen, wie ich das lösen soll. Ich müsste quasi ein ItemTemplate fest mit einer bestimmten Klasse verbinden, d.h. immer wenn ein Objekt dieser Klasse im TreeView auftaucht, wird ein entsprechendes ItemTemplate verwendet.

Ist das möglich? Kann ich Klassen eine Art Darstellung zuweisen?

27.03.2011 - 21:10 Uhr

Nicht selektieren bedeutet, dass keine Markierung der ausgewählten Node sichtbar wird. Ob das SelectItemProperty aktualisiert wird weiß ich nicht.

Zum Problem: Ich erstelle im Treeview eine Auflistung von Dateien. Diese Dateien wurden vorher analysiert.
Die Ergebnisse dieser Analyse werden als Unterknoten angezeigt. Ich habe dieses Projekt schon mit WinForms umgesetzt und wollte es nun nach WPF konvertieren.
Hauptsächlich wegen der Virtualisierung des TreeViews und um meine WPF Kenntnisse zu verbessern.

Unter WinForms wurden beim Öffnen der einzelnen Nodes dynamisch die passenden Ergebnisse nachgeladen.
Dies wollte ich unter WPF ähnlich realisieren, allerdings sollten hier die Items selbst die Logik dazu enthalten (unter Winforms hat die Form alles nachgeladen).
Daher habe ich mir eine eigene Itemklasse gebastelt, die dann eben die Ergebnisse selbst lädt und auch anzeigt.
Das klappt ja auch, nur scheint es eben nicht der richtige Weg zu sein.

Für Anregungen wäre ich sehr dankbar, WPF ist ja in vielerlei Hinsicht nicht so richtig von WinForms "konvertierbar" 😉

27.03.2011 - 17:17 Uhr

Hallo,
ich mache für diesen Problem der Übersichlichkeit halber einen neuen Thread auf.

Ich habe ein Custom TreeViewItem erstellt und kann dieses auch in einem TreeView anzeigen.
Allerdings lässt es sich nicht selektieren. Ausklappen klappt allerdings ohne Probleme.
Prinzipiell soll das TreeViewItem nur ein bisschen Logik erhalten und von selbst bei Bedarf ein paar Subitems erzeigen. Der Style soll der normale bleiben.

Hier mein Code dazu:

using System.IO;
using System.Windows;
using System.Windows.Controls;

namespace UnifaceAnalyserWPF
{
    public class ProFileTreeViewItem : TreeViewItem
    {
        public static DependencyProperty ProFileProperty = DependencyProperty.Register("ProFile", typeof(ProFile),
                                                                                       typeof(ProFileTreeViewItem),
                                                                                       new PropertyMetadata(null, ProFileChangedStatic));

        public ProFile ProFile
        {
            get { return (ProFile)GetValue(ProFileProperty); }
            set { SetValue(ProFileProperty, value); }
        }

        private readonly bool IsFile;
        private readonly IReference Component;

        public ProFileTreeViewItem()
        {
            IsFile = true;
            OverridesDefaultStyle = false;
        }

        public ProFileTreeViewItem(IReference component, int count, bool isFile = false)
        {
            Component = component;
            Header = component.ToString();
            Expanded += ProFileTreeViewItem_Expanded;
            IsFile = isFile;
        }

        void ProFileTreeViewItem_Expanded(object sender, RoutedEventArgs e)
        {
            if (!IsFile)
            {
                string reference = Component.Reference + ".pro";
                if (ProFileLoader.ProFiles.ContainsKey(reference))
                    ProFile = ProFileLoader.ProFiles[reference];
            }
        }

        private void ProFileChanged()
        {
            Header = Path.GetFileName(ProFile.FileName);
            foreach (var activate in ProFile.GlobalVariables)
            {
                Items.Add(new ProFileTreeViewItem(activate.Key, activate.Value));
            }
        }

        private static void ProFileChangedStatic(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            var sender = (ProFileTreeViewItem)dependencyObject;
            sender.ProFileChanged();
        }
    }
}

Das TreeView wird dann über ItemsSource und ein DataTemplate gefüllt:
DataTemplate

<DataTemplate x:Key="TreeViewTemplate">
            <UnifaceAnalyserWPF:ProFileTreeViewItem ProFile="{Binding Value}"/>
        </DataTemplate>

TreeView:

<TreeView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" x:Name="treeViewMain" VirtualizingStackPanel.IsVirtualizing="True" ItemTemplate="{StaticResource TreeViewTemplate}"/>

Das Befüllen klappt auch ohne Probleme, nur selektieren ist eben nicht drin.

Ich habe gerade festgestellt, dass wenn ich per Hand einige dieser Items hinzufüge alles klappt.
Es scheint also an ItemSource zu liegen?
Gibt es da irgendwelche Stolpersteine, die man als Anfönger mit WPF noch nicht kennt?

Ich hoffe mir kann jemand helfen! 😃

25.03.2011 - 10:17 Uhr

Okay, Problem selbst gelöst.
Durch

static ProFileTreeViewItem()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ProFileTreeViewItem), new FrameworkPropertyMetadata(typeof(ProFileTreeViewItem)));
        }

wurde natürlich der Style überschrieben und da ich keinen eigenen festgelegt habe, wurde einfach nichts angezeigt.

Jetzt habe ich aber ein weiteres Problem: die hinzugefügten Items lassen sich nicht markieren. Ein- und Ausklappen ist kein Problem, nur markieren lassen sie sich nicht.
Weiterhin fangen die Items irgendwie erst in der zweiten Ebene an, d.h. die Root-Items stehen viel zu weit ins TreeView hinein.

Hat jemand eine Idee?

25.03.2011 - 08:45 Uhr

Hallo,

ich bin gerade dabei, mir ein eigenes TreeViewItem zu basteln. Ich habe eine neue Klasse erstellt und diese von TreeViewItem abgeleitet.

Dann werden per ItemSource einige dieser CustomTreeViewItems erstellt. Das klappt scheinbar soweit auch noch ganz gut, der Kontruktor wird zuverlässig aufgerufen und das Databinding über das Template klappt auch.

Allerdings wird in dem TreeView nicht wirklich etwas angezeigt. Ich sehe, dass der Scrollbalken auftaucht und die Items sind auch vorhanden, nur haben sie einen leeren Header.
Wenn ich sie markiere, dann ist die Markierung nur zwei, drei Pixel breit. Füge ich per Hand noch Subitems hinzu, dann taucht auch kein kleiner Pfeil zum Ausklappen auf...

Irgendwie habe ich so das Gefühl, dass ich irgendwo eine Art Initialisierung oder so vergessen habe.
Ich beschäftige mich noch nicht so lange mit WPF, daher bin ich da noch etwas unsicher 😉

Hier mal der Code:

DataTemplate

<DataTemplate x:Key="TreeViewTemplate">
            <UnifaceAnalyserWPF:ProFileTreeViewItem ProFile="{Binding Value}"/>
        </DataTemplate>

ItemSource ist ein Dictionary, also macht auch das Binding auf "Value" einen Sinn. Das klappt aber auch, hier liegt das Problem also nicht...

TreeView:

<TreeView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" x:Name="treeViewMain" VirtualizingStackPanel.IsVirtualizing="True" ItemTemplate="{StaticResource TreeViewTemplate}"/>

Und zum Schluss noch mein TreeViewItem:

using System.IO;
using System.Windows;
using System.Windows.Controls;

namespace UnifaceAnalyserWPF
{
    public class ProFileTreeViewItem : TreeViewItem
    {
        public static DependencyProperty ProFileProperty = DependencyProperty.Register("ProFile", typeof(ProFile),
                                                                                       typeof(ProFileTreeViewItem),
                                                                                       new PropertyMetadata(null, ProFileChangedStatic));

        public ProFile ProFile
        {
            get { return (ProFile)GetValue(ProFileProperty); }
            set { SetValue(ProFileProperty, value); }
        }

        private bool IsFile;
        private IReference Component;

        static ProFileTreeViewItem()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ProFileTreeViewItem), new FrameworkPropertyMetadata(typeof(ProFileTreeViewItem)));
        }

        public ProFileTreeViewItem()
        {
            IsFile = true;
            Header = "Bac";
        }

        public ProFileTreeViewItem(bool isFile)
        {
            IsFile = isFile;
            Header = "cab";
        }

        public ProFileTreeViewItem(IReference component, int count)
        {
            Component = component;
            Header = component.ToString();
            Expanded += ProFileTreeViewItem_Expanded;
        }

        void ProFileTreeViewItem_Expanded(object sender, RoutedEventArgs e)
        {
            if(!IsFile)
            {
                ProFile = ProFileLoader.ProFiles[Component.Reference + ".pro"];
            }
        }

        private void ProFileChanged()
        {
            Header = Path.GetFileName(ProFile.FileName);
            foreach (var activate in ProFile.GlobalVariables)
            {
                Items.Add(new ProFileTreeViewItem(activate.Key, activate.Value));
            }
        }

        private static void ProFileChangedStatic(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            var sender = (ProFileTreeViewItem)dependencyObject;
            sender.ProFileChanged();
        }
    }
}

Bitte nicht von dem Code verwirren lassen, im Prinzip wird erst mal nur der Standard-Konstruktor aufgerufen und der Code in ProFileChanged. Dort wird auch der Header zugewiesen, der laut Debugger auch stets den richtigen Wert hat.

Ich hoffe, dass ganze ist nur ein dummer Fehler... 😃

19.02.2011 - 15:24 Uhr

Hallo,
ich verwende zur Zeit das Ribbon von Microsoft und wollte mir nun ein eigenes Template für die RibbonCheckBox schreiben.

Dabei bin ich allerdings auf ein Problem gestoßen...
Sobald ich das neue Tempalte zuweise, reagiert das Control auf keinerlei Eingaben mehr... Kein Click, Hover, etc...
Die Zuweisung IsChecked="true" setzt dann auch keinen Haken...
Interessanterweise passiert das auch, wenn ich z.B. in Blend auswähle das Standardtemplate zu verändern und dann aber eigentlich nichts verändere, sprich einfach nur das originale Template zuweise.

Ich habe noch nicht so lange mit WPF zu tun und vielleicht mache ich hier noch etwas falsch...
Aber ich denke, dass es vor allem mit Blend so funktionieren müsste...

Das Template (unverändert sieht so aus:

<r:RibbonWindow.Resources>
		
		<Style x:Key="RibbonCheckBoxStyle1" TargetType="{x:Type r:RibbonCheckBox}">
			<Setter Property="Background">
				<Setter.Value>
					<LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
						<GradientStop Color="#FFE7E7F7" Offset="0"/>
						<GradientStop Color="White" Offset="1"/>
					</LinearGradientBrush>
				</Setter.Value>
			</Setter>
			<Setter Property="BorderBrush" Value="#FFB5BEDE"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
			<Setter Property="MouseOverBorderBrush" Value="{Binding Ribbon.MouseOverBorderBrush, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="MouseOverBackground" Value="{Binding Ribbon.MouseOverBackground, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="PressedBorderBrush" Value="{Binding Ribbon.PressedBorderBrush, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="PressedBackground" Value="{Binding Ribbon.PressedBackground, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="CheckedBorderBrush" Value="{Binding Ribbon.CheckedBorderBrush, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="CheckedBackground" Value="{Binding Ribbon.CheckedBackground, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="FocusedBorderBrush" Value="{Binding Ribbon.FocusedBorderBrush, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="FocusedBackground" Value="{Binding Ribbon.FocusedBackground, RelativeSource={RelativeSource Self}}"/>
			<Setter Property="HorizontalContentAlignment" Value="Center"/>
			<Setter Property="ToolTipService.InitialShowDelay" Value="900"/>
			<Setter Property="ToolTipService.ShowDuration" Value="20000"/>
			<Setter Property="ToolTipService.BetweenShowDelay" Value="0"/>
			<Setter Property="QuickAccessToolBarControlSizeDefinition">
				<Setter.Value>
					<r:RibbonControlSizeDefinition IsLabelVisible="True" ImageSize="Collapsed"/>
				</Setter.Value>
			</Setter>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="{x:Type r:RibbonCheckBox}">
						<Border x:Name="MainBorder" Margin="1">
							<StackPanel x:Name="StackPanel" Background="Transparent" Margin="1" Orientation="Vertical" SnapsToDevicePixels="True">
								<Image x:Name="Image" RenderOptions.BitmapScalingMode="NearestNeighbor" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Height="32" Margin="1" Source="{TemplateBinding LargeImageSource}" VerticalAlignment="Center" Width="32"/>
								<Grid x:Name="Grid" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Center">
									<Grid HorizontalAlignment="Center" Margin="1" VerticalAlignment="Top">
										<Grid.ColumnDefinitions>
											<ColumnDefinition Width="Auto"/>
											<ColumnDefinition Width="Auto"/>
											<ColumnDefinition Width="Auto"/>
										</Grid.ColumnDefinitions>
										<Grid Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
											<Border x:Name="PART_CheckBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="White" Height="13" Width="13">
												<Grid>
													<Border x:Name="MiddleBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Background="{TemplateBinding Background}" Margin="1"/>
													<Border x:Name="InnerBorder" BorderThickness="1" Background="Transparent" Margin="1">
														<Border.BorderBrush>
															<LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
																<GradientStop Color="#80F7F7FF" Offset="0"/>
																<GradientStop Color="#F0F7F7FF" Offset="1"/>
															</LinearGradientBrush>
														</Border.BorderBrush>
													</Border>
													<Path x:Name="CheckMark" Data="M0,5.1L1.7,5.2 3.4,7.1 8,0.4 9.2,0 3.3,10.8z" Fill="{TemplateBinding Foreground}" FlowDirection="LeftToRight" Opacity="0" Stroke="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" StrokeThickness="0.4"/>
												</Grid>
											</Border>
										</Grid>
										<Image x:Name="SmallImage" RenderOptions.BitmapScalingMode="NearestNeighbor" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Height="16" Margin="2,0,1,0" Source="{TemplateBinding SmallImageSource}" Visibility="Collapsed" VerticalAlignment="Center" Width="16"/>
										<Grid x:Name="TwoLineTextPanel" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
											<r:RibbonTwoLineText x:Name="TwoLineText" LineStackingStrategy="BlockLineHeight" LineHeight="13" Margin="5,0" TextAlignment="Center" Text="{TemplateBinding Label}"/>
											<Rectangle x:Name="FocusVisual" Margin="1" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2" Visibility="Collapsed"/>
										</Grid>
									</Grid>
								</Grid>
							</StackPanel>
						</Border>
						<ControlTemplate.Triggers>
							<DataTrigger Binding="{Binding ControlSizeDefinition.ImageSize, RelativeSource={RelativeSource Self}}" Value="Large">
								<Setter Property="MinWidth" Value="44"/>
								<Setter Property="Height" Value="66"/>
								<Setter Property="MinHeight" TargetName="Grid" Value="26"/>
								<Setter Property="r:RibbonTwoLineText.HasTwoLines" TargetName="TwoLineText" Value="True"/>
							</DataTrigger>
							<DataTrigger Binding="{Binding ControlSizeDefinition.ImageSize, RelativeSource={RelativeSource Self}}" Value="Small">
								<Setter Property="MinWidth" Value="22"/>
								<Setter Property="Height" Value="22"/>
								<Setter Property="Visibility" TargetName="Image" Value="Collapsed"/>
								<Setter Property="Visibility" TargetName="SmallImage" Value="Visible"/>
								<Setter Property="Margin" TargetName="TwoLineText" Value="2,0"/>
								<Setter Property="Orientation" TargetName="StackPanel" Value="Horizontal"/>
								<Setter Property="r:RibbonTwoLineText.HasTwoLines" TargetName="TwoLineText" Value="False"/>
							</DataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding ControlSizeDefinition.ImageSize, RelativeSource={RelativeSource Self}}" Value="Small"/>
									<Condition Binding="{Binding IsInQuickAccessToolBar, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="Height" Value="Auto"/>
							</MultiDataTrigger>
							<DataTrigger Binding="{Binding ControlSizeDefinition.IsLabelVisible, RelativeSource={RelativeSource Self}}" Value="False">
								<Setter Property="Visibility" TargetName="TwoLineTextPanel" Value="Collapsed"/>
							</DataTrigger>
							<DataTrigger Binding="{Binding ControlSizeDefinition.ImageSize, RelativeSource={RelativeSource Self}}" Value="Collapsed">
								<Setter Property="Visibility" TargetName="Image" Value="Collapsed"/>
								<Setter Property="Visibility" TargetName="SmallImage" Value="Collapsed"/>
								<Setter Property="Height" Value="22"/>
							</DataTrigger>
							<Trigger Property="IsEnabled" Value="False">
								<Setter Property="Opacity" TargetName="Image" Value="0.5"/>
								<Setter Property="Opacity" TargetName="SmallImage" Value="0.5"/>
								<Setter Property="Opacity" TargetName="PART_CheckBorder" Value="0.5"/>
								<Setter Property="TextElement.Foreground" TargetName="MainBorder" Value="#FF9E9E9E"/>
							</Trigger>
							<DataTrigger Binding="{Binding HighContrast}" Value="True">
								<Setter Property="BorderBrush" TargetName="PART_CheckBorder" Value="{DynamicResource }"/>
								<Setter Property="Background" TargetName="PART_CheckBorder" Value="{DynamicResource }"/>
								<Setter Property="BorderBrush" TargetName="MiddleBorder" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
								<Setter Property="Background" TargetName="MiddleBorder" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
								<Setter Property="Fill" TargetName="CheckMark" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
								<Setter Property="Data" TargetName="CheckMark" Value="M10,1.2L4.5,7.3 1.5,5 1.5,7.5 4.5,10 4.5,10 10,4z"/>
								<Setter Property="BorderBrush" TargetName="InnerBorder" Value="Transparent"/>
								<Setter Property="Stroke" TargetName="FocusVisual" Value="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"/>
								<Setter Property="TextElement.Foreground" TargetName="MainBorder" Value="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"/>
							</DataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding HighContrast}" Value="False"/>
									<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="BorderBrush" TargetName="PART_CheckBorder" Value="{Binding MouseOverBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="BorderBrush" TargetName="MiddleBorder" Value="{Binding MouseOverBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="Background" TargetName="MiddleBorder" Value="{Binding MouseOverBackground, RelativeSource={RelativeSource TemplatedParent}}"/>
							</MultiDataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding HighContrast}" Value="False"/>
									<Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<MultiDataTrigger.EnterActions>
									<BeginStoryboard>
										<Storyboard>
											<DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckMark"/>
										</Storyboard>
									</BeginStoryboard>
								</MultiDataTrigger.EnterActions>
								<MultiDataTrigger.ExitActions>
									<BeginStoryboard>
										<Storyboard>
											<DoubleAnimation Duration="0:0:0.4" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CheckMark"/>
										</Storyboard>
									</BeginStoryboard>
								</MultiDataTrigger.ExitActions>
								<Setter Property="BorderBrush" TargetName="PART_CheckBorder" Value="{Binding CheckedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="BorderBrush" TargetName="MiddleBorder" Value="{Binding CheckedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="Background" TargetName="MiddleBorder" Value="{Binding CheckedBackground, RelativeSource={RelativeSource TemplatedParent}}"/>
							</MultiDataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding HighContrast}" Value="False"/>
									<Condition Binding="{Binding IsKeyboardFocused, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="BorderBrush" TargetName="PART_CheckBorder" Value="{Binding FocusedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="BorderBrush" TargetName="MiddleBorder" Value="{Binding FocusedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="Background" TargetName="MiddleBorder" Value="{Binding FocusedBackground, RelativeSource={RelativeSource TemplatedParent}}"/>
							</MultiDataTrigger>
							<Trigger Property="ShowKeyboardCues" Value="True">
								<Setter Property="Visibility" TargetName="FocusVisual" Value="Visible"/>
							</Trigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding HighContrast}" Value="False"/>
									<Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="BorderBrush" TargetName="PART_CheckBorder" Value="{Binding PressedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="BorderBrush" TargetName="MiddleBorder" Value="{Binding PressedBorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="Background" TargetName="MiddleBorder" Value="{Binding PressedBackground, RelativeSource={RelativeSource TemplatedParent}}"/>
							</MultiDataTrigger>
							<MultiTrigger>
								<MultiTrigger.Conditions>
									<Condition Property="IsChecked" Value="True"/>
									<Condition Property="IsMouseOver" Value="True"/>
								</MultiTrigger.Conditions>
								<Setter Property="Background" TargetName="InnerBorder">
									<Setter.Value>
										<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
											<GradientStop Color="#40FFFEFE" Offset="0"/>
											<GradientStop Color="#40FFFEFE" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.69"/>
											<GradientStop Color="#10FFFFFF" Offset="1"/>
										</LinearGradientBrush>
									</Setter.Value>
								</Setter>
							</MultiTrigger>
							<MultiTrigger>
								<MultiTrigger.Conditions>
									<Condition Property="IsChecked" Value="True"/>
									<Condition Property="IsKeyboardFocused" Value="True"/>
								</MultiTrigger.Conditions>
								<Setter Property="Background" TargetName="InnerBorder">
									<Setter.Value>
										<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
											<GradientStop Color="#40FFFEFE" Offset="0"/>
											<GradientStop Color="#40FFFEFE" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.69"/>
											<GradientStop Color="#10FFFFFF" Offset="1"/>
										</LinearGradientBrush>
									</Setter.Value>
								</Setter>
							</MultiTrigger>
							<MultiTrigger>
								<MultiTrigger.Conditions>
									<Condition Property="IsPressed" Value="True"/>
									<Condition Property="IsKeyboardFocused" Value="True"/>
								</MultiTrigger.Conditions>
								<Setter Property="Background" TargetName="InnerBorder">
									<Setter.Value>
										<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
											<GradientStop Color="#40FFFEFE" Offset="0"/>
											<GradientStop Color="#40FFFEFE" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.39"/>
											<GradientStop Color="#20FFCE68" Offset="0.69"/>
											<GradientStop Color="#10FFFFFF" Offset="1"/>
										</LinearGradientBrush>
									</Setter.Value>
								</Setter>
							</MultiTrigger>
							<Trigger Property="IsInControlGroup" Value="True">
								<Setter Property="BorderBrush" TargetName="MainBorder" Value="{Binding Ribbon.BorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
								<Setter Property="BorderThickness" TargetName="MainBorder" Value="0,0,1,0"/>
							</Trigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding HighContrast}" Value="True"/>
									<Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="Opacity" TargetName="CheckMark" Value="1"/>
							</MultiDataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding IsInControlGroup, RelativeSource={RelativeSource Self}}" Value="True"/>
									<Condition Binding="{Binding HighContrast}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="BorderBrush" TargetName="MainBorder" Value="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}"/>
							</MultiDataTrigger>
							<MultiDataTrigger>
								<MultiDataTrigger.Conditions>
									<Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="False"/>
									<Condition Binding="{Binding HighContrast}" Value="True"/>
								</MultiDataTrigger.Conditions>
								<Setter Property="TextElement.Foreground" TargetName="MainBorder" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
							</MultiDataTrigger>
						</ControlTemplate.Triggers>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
		
	</r:RibbonWindow.Resources>

Die Zuweisung erfolgt hier:

<r:RibbonCheckBox Label="Test" Style="{DynamicResource RibbonCheckBoxStyle1}"/>

Wie gesagt, den gesamten Code hat Blend erzeugt...
Hatte es auch schon per Hand ohne Style und nur mit Template versucht, das führte aber zum selben Ergebnis...

Hat irgendeiner eine Idee wo das Problem liegen könnte?

Oder kann man die Ribbonkomponenten gar nicht so einfach umbasteln? 8o

Liebe Grüße,
Fabian

07.01.2011 - 18:33 Uhr

Alles klar, danke.
Dann werde ich das wohl umbauen. 😉

07.01.2011 - 18:12 Uhr

Hallo,
habe gerade ein interessantes Problem.
Ich habe eine Form mit einem TabControl und mehreren Pages.
Auf einer dieser Pages ist ein Button. Unter gewissen Umständen wird nun PerformClick dieses Buttons ausgeführt.
Das klappt auch ohne Probleme - solange der Button sichtbar ist, man also aktuell die TabPage ausgewählt hat, auf der sich der Button befindet.

Ist eine andere Seite ausgewählt passiert einfach nichts. Das OnClick-Ereignis wird nicht ausgelöst.

Design-Fehler meinerseits oder ein seltsamer Bug? Kann mir da irgendjemand helfen?

Liebe Grüße,
Fabian

03.01.2011 - 01:17 Uhr

Ach und noch was: du könntest unter Win7 bei der Administration die letzen Projekte ja in diesen Startleisten-Dialog reinpacken (Rechtsklick).
Das wäre sehr praktisch. =)

02.01.2011 - 21:46 Uhr

Hey,
ist es eigentlich auch möglich ganze Verzeichnisse zu löschen?

29.12.2010 - 22:39 Uhr

Hey Maximilian,
ich habe noch einen Vorschlag: man kann Update-Pakete im Moment nur dann bearbeiten, wenn die alte Verzeichnisstruktur beim Upload des Pakets noch vorhanden ist.
Negativer Nebeneffekt: Du kannst die Administration effektiv nur auf einem Computer verwenden.
Auf einem anderen Computer kannst du nur neue Pakete hochladen, bestehende aber nicht ändern.
Daher meine Idee: Beim Bearbeiten erst das Paket komplett runterladen, dann temporär speichern, bearbeiten und daraus dann das neue Paket erstellen.

Fabi