WPF入門——Converter、XAML和Style


System.Windows.Data.IValueConverter 接口

派生
System.Activities.Core.Presentation.GenericTypeArgumentConverter
System.Activities.Presentation.Converters.ArgumentToExpressionConverter
System.Activities.Presentation.Converters.ModelPropertyEntryToModelItemConverter
System.Activities.Presentation.Converters.ModelPropertyEntryToOwnerActivityConverter
System.Activities.Presentation.Converters.ModelToObjectValueConverter
System.Windows.Controls.AlternationConverter
System.Windows.Controls.BooleanToVisibilityConverter
System.Windows.Controls.Ribbon.Primitives.RibbonWindowSmallIconConverter
System.Windows.Documents.ZoomPercentageConverter
System.Windows.Navigation.JournalEntryListConverter

該接口只有兩個方法,
Convert(Object, Type, Object, CultureInfo)
ConvertBack(Object, Type, Object, CultureInfo)
用戶實現該接口之后可以創建一些類型轉換,舉個簡單例子:參數是int返回string。

Binding

System.Windows.Data.binding有一個Converter屬性,如下面的例子:

Visibility=
"{Binding ElementName=Window,
Path=WindowState, 
Converter={StaticResource MaxButtonConverter}, 
ConverterParameter=Max, 
Mode=OneWay}"

上述代碼是一個button的可視屬性的設置,代碼創建了一個binding實例(xaml的本質就是創建實例),binding了VisibilityWindow.WindowState,binding的時候通過convertor轉換Window.WindowState類型到Visibility類型。
上面的converter的代碼如下:

/// <summary>
/// 切換最大化按鈕,把WindowState的枚舉類型轉換成Visibility
/// </summary>
public class MaxButtonConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		if (parameter.ToString() == "Max")
		{
			if ((WindowState)value != WindowState.Maximized)
			{
				return "Visible";
			}
			return "Collapsed";
		}
		if ((WindowState)value != WindowState.Maximized)
		{
			return "Collapsed";
		}
		return "Visible";
	}

	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		return null;
	}
}   

xaml的一點說明

這里說一下xaml的一個語法,
<Button Width="45" Height="32" Style="{DynamicResource normalButtonStyle}" Background="#00FFFFFF">
直接在“引號”中賦值的,是賦值了button的屬性
例如Width="45"實際上用代碼表示就是button.Width = 45

引號中帶花括號的,是賦值了一個實例,上面的Style就是賦值了一個資源字典中的實例,賦值方式是動態。

Visibility=
"{Binding ElementName=Window,
Path=WindowState, 
Converter={StaticResource MaxButtonConverter}, 
ConverterParameter=Max, 
Mode=OneWay}"

這里也是賦值了一個對象,不過這個對象是新創建的,新創建的binding對象的時候賦值了一些屬性給binding對象(path、convertor等)

Style

我們可以定義一個資源字典,添加字典到Application的屬性中,這樣每個控件都可以隨時根據key使用定義在資源字典中的Style。
一個Style定義的例子:

    <Style x:Key="ContextMenuStyle" TargetType="{x:Type ContextMenu}">
    <Setter Property="UIElement.SnapsToDevicePixels" Value="True" />
    <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True" />
    <Setter Property="Grid.IsSharedSizeScope" Value="True" />
    <Setter Property="ContextMenu.HasDropShadow" Value="True" />
    <Setter Property="MaxWidth" Value="250" />
    <Setter Property="Margin" Value="0,10" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type ContextMenu}">
          <Border Name="Border" Background="{TemplateBinding Background}" BorderThickness="10">
            <UIElement.Effect>
              <DropShadowEffect BlurRadius="10" Opacity="0.2" ShadowDepth="0" />
            </UIElement.Effect>
            <ScrollViewer Style="{DynamicResource for_scrollviewer}" Margin="0,8">
              <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
            </ScrollViewer>
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

上面摘自一個資源字典,實際上是定義了一個Style類型的對象實例,並添加到了資源字典,key是ContextMenuStyle
style類有如下屬性和方法:

        public Style();
        public Style(Type targetType);
        public Style(Type targetType, Style basedOn);

        public bool IsSealed { get; }
        [Ambient]
        [Localizability(LocalizationCategory.NeverLocalize)]
        public Type TargetType { get; set; }
        [Ambient]
        [DefaultValue(null)]
        public Style BasedOn { get; set; }
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public TriggerCollection Triggers { get; }
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SetterBaseCollection Setters { get; }
        [Ambient]
        public ResourceDictionary Resources { get; set; }

        public override int GetHashCode();
        public void RegisterName(string name, object scopedElement);
        public void Seal();
        public void UnregisterName(string name);

Trigger、Setters等介紹:

setter類,擁有value(object)、property等屬性

    [XamlSetMarkupExtension("ReceiveMarkupExtension")]
    [XamlSetTypeConverter("ReceiveTypeConverter")]
    public class Setter : SetterBase, ISupportInitialize
    {
        public Setter();
        public Setter(DependencyProperty property, object value);
        public Setter(DependencyProperty property, object value, string targetName);

        [Ambient]
        [DefaultValue(null)]
        [Localizability(LocalizationCategory.None, Modifiability = Modifiability.Unmodifiable, Readability = Readability.Unreadable)]
        public DependencyProperty Property { get; set; }
        [DependsOn("Property")]
        [DependsOn("TargetName")]
        [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]
        [TypeConverter(typeof(SetterTriggerConditionValueConverter))]
        public object Value { get; set; }
        [Ambient]
        [DefaultValue(null)]
        public string TargetName { get; set; }

        public static void ReceiveMarkupExtension(object targetObject, XamlSetMarkupExtensionEventArgs eventArgs);
        public static void ReceiveTypeConverter(object targetObject, XamlSetTypeConverterEventArgs eventArgs);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM