2016-05-02 4 views
0

ネストされたTextblockを持つLabel(Textwrapping用)からなるWPFユーザーコントロールを作成しました。 このようなusercontrolsをドラッグアンドドロップするので、usercontrolのコピーの作成に問題があるため、XAML定義で名前を使用しません。 代わりに、ビューモデルを使用します。 テキストブロックのDependencyProperties(FontSizeなど)は、祖先(UserControl)のプロパティにバインドされています。例えば、パーUserControlのネストされたコントロールプロパティをリフレッシュする方法

 <TextBlock Text="{Binding Path=Text, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
        FontSize="{Binding RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=FontSize}" 

そして、我々はそれを取得し、設定することができるように、我々は、ユーザーコントロールののFontSize-プロパティをオーバーライドし、ユーザーコントロールのCS-ファイル内:

public new double FontSize 
    { 
     get { return base.FontSize; } 
     set { base.FontSize = value; } 
    } 

問題は、WPFウィンドウにドロップした後でusercontrolsプロパティを編集する可能性があることです。

これは、Drop-eventダイアログの後に開き、UserControlにFrameworkElementを与えます。 そのダイアログで、p.eを変更することができます。 FontSize。 上記のFontSizeプロパティのsetterが呼び出され、base.FontSizeが変更されます。 デバッガで指定された要素のプロパティを調べると、FontSizeが変更されます。 しかし、私たちのusercontrol内のTextBlockの視覚的なFontSizeは同じです。

どうすれば更新できますか?

ありがとうございます!

P.S .: 2番目のWPFウィンドウにUserControlをドロップすると、コントロールのコピーがXAMLシリアル化と標準化によって作成されます。 は、最初のステップの後 - 直列化 - 私たちは、Label-ユーザーコントロールのためにそのような文字列を取得します:

<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> 

それはシリアル化制御に何らかの損害を与えたということはできますか? 私は上記のように、セッターが動作し、プロパティが変更されますが、コントロール内のテキストは同じままです。

答えて

0

問題は、セリゼーションによってバインディングが削除されることです。 これは、ドラッグされたコントロールの新しいインスタンスをXAMLシリアル化と非標準化によってコピーする代わりに作成することで回避できます。

関連する問題