如何刷新UserControl中的嵌套控件属性

时间:2016-05-02 11:37:04

标签: c# wpf xaml user-controls

我们制作了一个WPF用户控件,它由一个带有嵌套Textblock作为内容的Label(用于文本包装)组成。 因为我们拖放像这样的用户控件,所以我们在XAML-Definition中不使用任何名称,因为创建usercontrol的副本存在问题。 所以我们使用viewmodel。 文本块的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窗口上删除后编辑usercontrols属性。

为此,我们在Drop-event a Dialog之后打开,并将UserControl作为FrameworkElement提供给它。 然后在那个Dialog中我们可以改变p.e. FontSize。 调用上面FontSize属性的setter并更改base.FontSize。 当我们查看调试器中给定元素的属性时,FontSize会发生变化。 但是我们的usercontrol中TextBlock的可视FontSize仍然是相同的。

我们如何刷新?

提前致谢!

P.S。:当我们在第二个WPF窗口上放下UserControl时,我们通过XAML-serialization和-deserialization复制控件。 在第一步 - 序列化之后 - 我们得到一个类似于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工作和属性改变,但控件中的文本保持不变。

1 个答案:

答案 0 :(得分:0)

问题是序列化删除了绑定。 这可以通过创建拖动控件的新实例来避免,而不是通过XAML序列化和反序列化来复制它。