2009-03-06 3 views
0

Vor langer Zeit schaute ich auf this MSDN walkthrough. Es implementiert einen Farbeditor und der Tooltip verwendet den Namen der Farbe wie "Rot" oder "Blau".Was ist der Unterschied zwischen diesen beiden Bindungen?

Heute implementiere ich eine ListBox, die ähnlich ist; Es zeigt eine Box mit der Farbe und dem Namen der Farbe daneben. Außer in meiner Anwendung werden alle Farbnamen als Hex-Werte wie # FFFF0000 und # FF0000FF angezeigt. Warum?

Hier ist die ColorsList Klasse in beiden Projekten verwendet:

public ColorsList() 
{ 
    Type type = typeof(Colors); 
    foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.Static)) 
    { 
     if (propertyInfo.PropertyType == typeof(Color)) 
     { 
      Add((Color)propertyInfo.GetValue(null, null)); 
     } 
    } 
} 

Dieser XAML-Snippet macht der Tooltip den Namen der Farbe in der MSDN-Projekt verwenden (Sie können den Rest des Codes im Durchlauf sehen):

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Button Tag="{Binding}" Command="{x:Static PropertyEditing:PropertyValueEditorCommands.ShowInlineEditor}"> 
      <Button.Template> 
       <ControlTemplate> 
        <Border Width="30" Height="30" BorderBrush="Black" BorderThickness="1" CornerRadius="5"> 
         <Rectangle Width="22" Height="22" ToolTip="{Binding}"> 
          <Rectangle.Fill> 
           <SolidColorBrush Color="{Binding}"/> 
          </Rectangle.Fill> 
         </Rectangle> 
        </Border> 
       </ControlTemplate> 
      </Button.Template> 
     </Button> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

Hier ist meine XAML, den hex-Codes erzeugt:

<ListBox x:Name="lstColors" Grid.Row="1" ItemsSource="{StaticResource colors}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Rectangle Stroke="Black" 
          StrokeThickness="3" 
          Width="24" 
          Height="24" 
          RadiusX="5" 
          RadiusY="5"> 
        <Rectangle.Fill> 
         <SolidColorBrush Color="{Binding}" /> 
        </Rectangle.Fill> 
       </Rectangle> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Es sieht für mich genauso aus; was ist der Unterschied?

Antwort

0

Es stellt sich heraus, dass die Entwurfszeit von der Laufzeit abweicht. Das MSDN-Beispiel wird als ein erweiterter Eigenschaftseditor verwandt. Ich habe den Rat eines Freundes genommen und versucht, ihn als Laufzeitsteuerung zu entlarven, und magischerweise Hash-Namen für Farben anstelle von freundlichen Namen erhalten. Ordentlich.

1

Nicht gerade eine Antwort auf Ihre Frage, eher eine Beobachtung:

Wenn Sie ColorsList ändern von ObservableCollection<string> statt ObservableCollection<Color> und ändern Sie die folgende Zeile zu erben:

Add((Color)propertyInfo.GetValue(null, null)); 

zu

Add(propertyInfo.Name); 

Ihr Code wird funktionieren, wie Sie möchten, dass es funktioniert. Anstatt die Farbe in einen Farbnamen umzuwandeln, geht das anders herum - mit der integrierten Umwandlung von Farbnamen in Farbe.

Als Randbemerkung, habe ich versucht, den XAML-Code aus der MSDN Probe (nur der Teil Sie unter Berufung auf), aber die Tooltips Farbcodes angezeigt werden und nicht die Farbnamen.