使用风格的行为
Use behavior in style
我有一个行为,如何在 TextBlock 样式中使用它,以便它应用于所有 TextBlock。
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Distance}" >
<i:Interaction.Behaviors>
<Behaviors:EmptyToNaBehaviour/>
</i:Interaction.Behaviors>
</TextBlock>
这是我的附加行为,基本上是将空值更改为 N/A
public class EmptyToNaBehaviour : Behavior<TextBlock>
{
protected override void OnAttached()
{
var txtblock = this.AssociatedObject as TextBlock;
if (txtblock != null && string.IsNullOrEmpty(txtblock.Text))
{
txtblock.Text = "N/A";
}
}
}
WPF 中基本上有两种不同的行为实现方式,通常称为附加行为和混合行为。
附加行为只是附加的 属性 和附加的 PropertyChangedCallback
更改处理程序,当值依赖关系 属性 发生变化。
您通常将附加行为定义为静态 class,并使用一组静态方法来获取和设置依赖项的值 属性 并作为回调的结果执行所需的逻辑被调用。您可以轻松地在样式中设置任何此类属性的值:
<Setter Property="local:EmptyToNaBehaviour.SomeProperty" Value="x"/>
与普通的附加行为相比,Blend 行为提供了一种更好的封装行为功能的方法。它们也更容易设计友好,因为它们可以通过 Blend 中的拖放功能轻松附加到 UI 中的视觉元素。但恐怕你无法真正将 Blend 行为添加到 Style
setter:
How to add a Blend Behavior in a Style Setter
因此,如果您希望能够在 Style
的上下文中应用您的行为,您应该编写附加行为而不是混合行为。
编辑: 您的行为是混合行为。将其替换为附加行为:
public class EmptyToNaBehaviour
{
public static string GetText(TextBlock textBlock)
{
return (string)textBlock.GetValue(IsBroughtIntoViewWhenSelectedProperty);
}
public static void SetText(TextBlock textBlock, string value)
{
textBlock.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);
}
public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty =
DependencyProperty.RegisterAttached(
"Text",
typeof(string),
typeof(EmptyToNaBehaviour),
new UIPropertyMetadata(null, OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBlock txtblock = d as TextBlock;
if(txtblock != null)
txtblock.Loaded += Txtblock_Loaded;
}
private static void Txtblock_Loaded(object sender, RoutedEventArgs e)
{
TextBlock txtblock = sender as TextBlock;
string text = GetText(txtblock);
if (txtblock != null && !string.IsNullOrEmpty(text) && string.IsNullOrEmpty(txtblock.Text))
{
txtblock.Text = text;
}
}
}
用法:
<TextBlock Grid.Row="0" Grid.Column="1" Text="text"
Behaviors:EmptyToNaBehaviour.Text="N/A">
</TextBlock>
或风格:
<Style x:Key="style" TargetType="TextBlock">
<Setter Property="Behaviors:EmptyToNaBehaviour.Text" Value="N/A" />
</Style>
我有一个行为,如何在 TextBlock 样式中使用它,以便它应用于所有 TextBlock。
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Distance}" >
<i:Interaction.Behaviors>
<Behaviors:EmptyToNaBehaviour/>
</i:Interaction.Behaviors>
</TextBlock>
这是我的附加行为,基本上是将空值更改为 N/A
public class EmptyToNaBehaviour : Behavior<TextBlock>
{
protected override void OnAttached()
{
var txtblock = this.AssociatedObject as TextBlock;
if (txtblock != null && string.IsNullOrEmpty(txtblock.Text))
{
txtblock.Text = "N/A";
}
}
}
WPF 中基本上有两种不同的行为实现方式,通常称为附加行为和混合行为。
附加行为只是附加的 属性 和附加的 PropertyChangedCallback
更改处理程序,当值依赖关系 属性 发生变化。
您通常将附加行为定义为静态 class,并使用一组静态方法来获取和设置依赖项的值 属性 并作为回调的结果执行所需的逻辑被调用。您可以轻松地在样式中设置任何此类属性的值:
<Setter Property="local:EmptyToNaBehaviour.SomeProperty" Value="x"/>
与普通的附加行为相比,Blend 行为提供了一种更好的封装行为功能的方法。它们也更容易设计友好,因为它们可以通过 Blend 中的拖放功能轻松附加到 UI 中的视觉元素。但恐怕你无法真正将 Blend 行为添加到 Style
setter:
How to add a Blend Behavior in a Style Setter
因此,如果您希望能够在 Style
的上下文中应用您的行为,您应该编写附加行为而不是混合行为。
编辑: 您的行为是混合行为。将其替换为附加行为:
public class EmptyToNaBehaviour
{
public static string GetText(TextBlock textBlock)
{
return (string)textBlock.GetValue(IsBroughtIntoViewWhenSelectedProperty);
}
public static void SetText(TextBlock textBlock, string value)
{
textBlock.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);
}
public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty =
DependencyProperty.RegisterAttached(
"Text",
typeof(string),
typeof(EmptyToNaBehaviour),
new UIPropertyMetadata(null, OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBlock txtblock = d as TextBlock;
if(txtblock != null)
txtblock.Loaded += Txtblock_Loaded;
}
private static void Txtblock_Loaded(object sender, RoutedEventArgs e)
{
TextBlock txtblock = sender as TextBlock;
string text = GetText(txtblock);
if (txtblock != null && !string.IsNullOrEmpty(text) && string.IsNullOrEmpty(txtblock.Text))
{
txtblock.Text = text;
}
}
}
用法:
<TextBlock Grid.Row="0" Grid.Column="1" Text="text"
Behaviors:EmptyToNaBehaviour.Text="N/A">
</TextBlock>
或风格:
<Style x:Key="style" TargetType="TextBlock">
<Setter Property="Behaviors:EmptyToNaBehaviour.Text" Value="N/A" />
</Style>