如何刷新 UserControl 中的嵌套控件 属性
How to refresh nested control property in UserControl
我们制作了一个 WPF 用户控件,其中包含一个标签和一个嵌套的文本块作为内容(用于文本换行)。
因为我们像这样拖放用户控件,所以我们在 XAML-Definition 中没有使用任何名称,因为创建用户控件的副本时存在问题。
所以我们改用视图模型。
文本块的 DependencyProperties(如 FontSize)绑定到祖先(UserControl)的 属性。
例如:
<TextBlock Text="{Binding Path=Text, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
FontSize="{Binding RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=FontSize}"
并且在 UserControl 的 CS 文件中,我们覆盖了 UserControl 的 FontSize-属性,以便我们可以获取和设置它:
public new double FontSize
{
get { return base.FontSize; }
set { base.FontSize = value; }
}
现在的问题是,我们希望能够在放置在 WPF 上后编辑用户控件属性 window。
为此,我们在 Drop-event 之后打开一个 Dialog,并将 UserControl 作为 FrameworkElement 提供给它。
然后在该对话框中我们可以更改 p.e。字体大小。
上面的FontSize属性的setter被调用,base.FontSize被改变了。
当我们查看调试器中给定元素的 属性 时,FontSize 已更改。
但是我们用户控件中TextBlock的视觉FontSize还是一样。
我们如何刷新?
提前致谢!
P.S.: 当我们在第二个 WPF-window 上放置一个 UserControl 时,我们通过 XAML-序列化和-反序列化制作了该控件的副本。
在第一步 - 序列化 - 我们得到一个类似于 Label-UserControl 的字符串:
<ControlLabel Text="Label1" ControlFontSize="12" ControlFontWeight="Normal" ControlFontStyle="Normal" ControlHorizontalContentAlignment="Left" ControlVerticalContentAlignment="Top" BorderBrush="#FF00FFFF" BorderThickness="1,1,1,1" av:Canvas.Left="103" av:Canvas.Top="214" xmlns="clr-namespace:WpfDesignerControlLibrary;assembly=WpfDesignerControlLibrary" xmlns:assembly="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ControlLabel.TextDecorations>
<assembly:Null />
</ControlLabel.TextDecorations>
<av:Grid>
<av:Grid.ColumnDefinitions>
<av:ColumnDefinition />
</av:Grid.ColumnDefinitions>
<av:Grid.RowDefinitions>
<av:RowDefinition Height="*" />
</av:Grid.RowDefinitions>
<av:Border BorderThickness="0,0,0,0" BorderBrush="{assembly:Null}">
<av:Border.Style>
<av:Style TargetType="av:IFrameworkInputElement">
<av:Style.Resources>
<av:ResourceDictionary />
</av:Style.Resources>
<av:Setter Property="av:Border.BorderBrush">
<av:Setter.Value>
<av:SolidColorBrush>#FF4169E1</av:SolidColorBrush>
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:Border.BorderThickness">
<av:Setter.Value>
<av:Thickness>1,1,1,1</av:Thickness>
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:FrameworkElement.HorizontalAlignment">
<av:Setter.Value>
<assembly:Static Member="av:HorizontalAlignment.Stretch" />
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:FrameworkElement.VerticalAlignment">
<av:Setter.Value>
<assembly:Static Member="av:VerticalAlignment.Stretch" />
</av:Setter.Value>
</av:Setter>
</av:Style>
</av:Border.Style>
<av:Label HorizontalContentAlignment="Left" VerticalContentAlignment="Top" Margin="2,2,2,2">
<av:TextBlock Text="Label1" FontStyle="Normal" FontWeight="Normal" FontSize="12" TextAlignment="Left" TextWrapping="Wrap">
<av:TextBlock.TextDecorations>
<assembly:Null />
</av:TextBlock.TextDecorations>
</av:TextBlock>
</av:Label>
</av:Border>
</av:Grid>
</ControlLabel>
会不会是序列化对控件造成了一些损坏?
正如我上面所说,setter 有效,属性 发生变化,但控件中的文本保持不变。
问题是序列化删除了绑定。
这可以通过创建拖动控件的新实例而不是通过 XAML-serialization und -deserialization.
复制它来避免。
我们制作了一个 WPF 用户控件,其中包含一个标签和一个嵌套的文本块作为内容(用于文本换行)。 因为我们像这样拖放用户控件,所以我们在 XAML-Definition 中没有使用任何名称,因为创建用户控件的副本时存在问题。 所以我们改用视图模型。 文本块的 DependencyProperties(如 FontSize)绑定到祖先(UserControl)的 属性。
例如:
<TextBlock Text="{Binding Path=Text, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
FontSize="{Binding RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=FontSize}"
并且在 UserControl 的 CS 文件中,我们覆盖了 UserControl 的 FontSize-属性,以便我们可以获取和设置它:
public new double FontSize
{
get { return base.FontSize; }
set { base.FontSize = value; }
}
现在的问题是,我们希望能够在放置在 WPF 上后编辑用户控件属性 window。
为此,我们在 Drop-event 之后打开一个 Dialog,并将 UserControl 作为 FrameworkElement 提供给它。 然后在该对话框中我们可以更改 p.e。字体大小。 上面的FontSize属性的setter被调用,base.FontSize被改变了。 当我们查看调试器中给定元素的 属性 时,FontSize 已更改。 但是我们用户控件中TextBlock的视觉FontSize还是一样。
我们如何刷新?
提前致谢!
P.S.: 当我们在第二个 WPF-window 上放置一个 UserControl 时,我们通过 XAML-序列化和-反序列化制作了该控件的副本。 在第一步 - 序列化 - 我们得到一个类似于 Label-UserControl 的字符串:
<ControlLabel Text="Label1" ControlFontSize="12" ControlFontWeight="Normal" ControlFontStyle="Normal" ControlHorizontalContentAlignment="Left" ControlVerticalContentAlignment="Top" BorderBrush="#FF00FFFF" BorderThickness="1,1,1,1" av:Canvas.Left="103" av:Canvas.Top="214" xmlns="clr-namespace:WpfDesignerControlLibrary;assembly=WpfDesignerControlLibrary" xmlns:assembly="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ControlLabel.TextDecorations>
<assembly:Null />
</ControlLabel.TextDecorations>
<av:Grid>
<av:Grid.ColumnDefinitions>
<av:ColumnDefinition />
</av:Grid.ColumnDefinitions>
<av:Grid.RowDefinitions>
<av:RowDefinition Height="*" />
</av:Grid.RowDefinitions>
<av:Border BorderThickness="0,0,0,0" BorderBrush="{assembly:Null}">
<av:Border.Style>
<av:Style TargetType="av:IFrameworkInputElement">
<av:Style.Resources>
<av:ResourceDictionary />
</av:Style.Resources>
<av:Setter Property="av:Border.BorderBrush">
<av:Setter.Value>
<av:SolidColorBrush>#FF4169E1</av:SolidColorBrush>
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:Border.BorderThickness">
<av:Setter.Value>
<av:Thickness>1,1,1,1</av:Thickness>
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:FrameworkElement.HorizontalAlignment">
<av:Setter.Value>
<assembly:Static Member="av:HorizontalAlignment.Stretch" />
</av:Setter.Value>
</av:Setter>
<av:Setter Property="av:FrameworkElement.VerticalAlignment">
<av:Setter.Value>
<assembly:Static Member="av:VerticalAlignment.Stretch" />
</av:Setter.Value>
</av:Setter>
</av:Style>
</av:Border.Style>
<av:Label HorizontalContentAlignment="Left" VerticalContentAlignment="Top" Margin="2,2,2,2">
<av:TextBlock Text="Label1" FontStyle="Normal" FontWeight="Normal" FontSize="12" TextAlignment="Left" TextWrapping="Wrap">
<av:TextBlock.TextDecorations>
<assembly:Null />
</av:TextBlock.TextDecorations>
</av:TextBlock>
</av:Label>
</av:Border>
</av:Grid>
</ControlLabel>
会不会是序列化对控件造成了一些损坏? 正如我上面所说,setter 有效,属性 发生变化,但控件中的文本保持不变。
问题是序列化删除了绑定。 这可以通过创建拖动控件的新实例而不是通过 XAML-serialization und -deserialization.
复制它来避免。