嗨,大家好我厌倦了在xaml中制作我的自定义属性以进行所有控制
// ...
<TextBlock x:Name="tblck1"/>
//...
我想创建一个像这样的人:
//...
<TextBlock g:Language="EN"/>
//...
我厌倦了一个静态类和MarkupExtension,但它似乎不是正确的方法! 请帮我。 提前谢谢。
答案 0 :(得分:1)
首先,我不明白为什么你想要一个自定义前缀g:
来定义Language
属性。
你有两种选择来实现你想要的目标。
依赖属性
来自msdn的依赖属性的目的是提供一种计算方法 基于其他输入值的属性值。这些 其他输入可能包括系统属性,如主题和用户 偏好,及时财产确定机制,如 数据绑定和动画/故事板,多用途模板等 作为资源和样式,或通过父子知道的值 与元素树中其他元素的关系
附加属性
附加属性是XAML定义的概念。附加属性旨在用作可在任何对象上设置的全局属性类型。在Windows Presentation Foundation(WPF)中,附加属性通常被定义为依赖属性的一种特殊形式,它没有传统的属性“wrapper”。
你指定你想要这样的东西
<TextBlock g:Language="EN"/>
如果你想让它看起来像这样
<TextBlock Language="EN"/>
然后你没有其他办法,只能创建一个源自TextBlock
并创建Dependency property
的自定义控件。
所以它最终会得到像这样的东西
<controls:CustomTextBlock Language="EN"/>
您拥有的另一个选择是创建attach property
,最终看起来像
<TextBlock attachProperties:ClassToDefineAttachProperty.Language="EN"/>
选择取决于你。
我宁愿选择attached properties
,因为在涉及Language
属性等问题时,更容易扩展现有的类。
答案 1 :(得分:0)
谢谢大家,我完成了这段代码,它完美无缺:
public class DesignMode : FrameworkElement
{
public static GAppLanguage GetDesignLanguage(DependencyObject obj)
{
return (GAppLanguage)obj.GetValue(DesignLanguageProperty);
}
public static void SetDesignLanguage(DependencyObject obj, GAppLanguage value)
{
obj.SetValue(DesignLanguageProperty, value);
}
public static readonly DependencyProperty DesignLanguageProperty =
DependencyProperty.RegisterAttached("DesignLanguage", typeof(GAppLanguage), typeof(DesignMode), new PropertyMetadata(GAppLanguage.EN, new PropertyChangedCallback(DesingLanguageChanged)));
private static void DesingLanguageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DesignMode.DesignLanguage = (GAppLanguage) Enum.Parse(typeof(GAppLanguage),e.NewValue.ToString());
}
public static GAppLanguage DesignLanguage { get; set; }
}
我在我的xaml中使用它:
<TextBlock Text="{GtringResource gtringtest}" d:DesignMode.DesignLanguage="EN" />