2017-06-07 9 views
1

私はAppDomain境界を介してUserControlを渡そうとしていて、FrameworkElementAdapters.ViewToContractAdapter()ContractToViewAdapter()という奇妙な動作に気がつきました。 INativeHandleContractFrameworkElementAdapters.ContractToViewAdapters()を使用してFrameworkElementに変換された後、ラップされたUserControlは、その子の1つが大きくなると、そのサイズをもう変更しません。WPF UI AddInのサイズが更新されない

この動作は簡単な、空、WPFウィンドウを使用して実証することができます。

public partial class MainWindow : Window 
{ 
    private ListBox listBox; 
    private Button myButton; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     listBox = new ListBox(); 
     Content = listBox; 

     myButton = new Button { Content = "Click me" }; 
     myButton.Click += (sender, args) => myButton.Content = "Lorem ipsum dolor sit amet."; 
     myButton.SizeChanged += (sender, args) => Debug.WriteLine($"{myButton.DesiredSize}"); 
     //listBox.Items.Add(myButton); 

     var frameworkElement = FrameworkElementAdapters.ContractToViewAdapter(FrameworkElementAdapters.ViewToContractAdapter(myButton)); 
     listBox.Items.Add(frameworkElement); 
    } 
} 

期待どおりに、テキストの変更をボタンをクリックした場合。ボタンはサイズ変更されませんが、切り捨てられたテキストが残ります。最後の2行をコメントアウトしてボタンを追加するだけで、期待どおりに動作します。

基本的にはthisの場合と同じ問題だと思いますが、解決策がないようです。誰にもこれを取り除く方法を知っていますか?

ありがとうございます!

+0

ボタンをグリッドにカプセル化して動作を変更することができました。自動サイズのColumnDefinitionとRowDefinitionを持つだけです。今、少なくとも、HwndHost/FrameworkElement内のボタンのサイズが変わっているようです。 – edsplash

答えて

0

私のコメントで述べたように、さらにGridですべてを包むことはトリックを行うように見えるか、少なくとも、あなたはその結果のFrameworkElementのサイズを変更するために使用することができますSizeChangedイベントを受け取ることができます。私の場合は

public partial class MainWindow : Window 
{ 
    private ListBox listBox; 
    private Button myButton; 
    private Grid dummyGrid; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     listBox = new ListBox(); 
     Content = listBox; 

     myButton = new Button { Content = "Click me" }; 
     myButton.Click += (sender, args) => 
     { 
      myButton.Content = "Lorem ipsum dolor sit amet."; 
      myButton.FontSize = 24; 
     }; 

     dummyGrid = new Grid(); 
     dummyGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); 
     dummyGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); 
     dummyGrid.Children.Add(myButton); 

     var frameworkElement = 
      FrameworkElementAdapters.ContractToViewAdapter(
       FrameworkElementAdapters.ViewToContractAdapter(dummyGrid)); 
     listBox.Items.Add(frameworkElement); 

     // Automatically adjust HwndHost's size when the grid changes 
     dummyGrid.SizeChanged += (sender, args) => 
     { 
      frameworkElement.Width = args.NewSize.Width; 
      frameworkElement.Height = args.NewSize.Height; 
     };    
    } 
} 

私は(例えば、シリアライズなどをbeeingてSizeChangedEventArgsない)AppDomainの境界を通過するイベントを取得するには、いくつかの魔法をしなければなりませんでした。

関連する問題