簡體   English   中英

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

[英]How to refresh nested control property in UserControl

我們制作了一個WPF用戶控件,該控件由一個Label和一個嵌套的Textblock作為Content組成(用於文本包裝)。 因為我們像這樣拖放用戶控件,所以在XAML定義中不使用任何名稱,因為創建用戶控件的副本存在問題。 因此,我們改用視圖模型。 文本塊的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屬性。

為此,我們在放置事件后打開一個對話框,並將UserControl作為FrameworkElement提供給它。 然后,在該對話框中,我們可以更改FontSize。 調用上面FontSize屬性的設置方法,並更改base.FontSize。 當我們在調試器中查看給定元素的屬性時,FontSize被更改。 但是我們用戶控件中TextBlock的可視FontSize仍然相同。

我們如何刷新?

提前致謝!

PS:在第二個WPF窗口上放置UserControl時,我們通過XAML序列化和-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可以工作並且屬性會更改,但是控件中的文本保持不變。

問題是串行化會刪除綁定。 通過創建拖動控件的新實例,而不是通過XAML序列化和反序列化來復制它,可以避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM