2010-12-30 7 views
1

私は、異なるAppDomainからINativeHandleContractを介してUIコントロールの1つを取得するアプリケーションを持っています。コントロールのサイズが変更されると、ホスト内のFrameworkElementは更新されたサイズを取得しません。私はこれを解決する方法があるかどうか疑問に思っていた。あなたはStackPanelの高さが変わることを期待するパンダを拡張し、崩壊したようWPF UI AddInが希望のサイズを更新しない

public partial class Window1 : Window 
{ 
    private StackPanel m_stackPanel; 
    private Expander m_expander; 

    private UIElement m_expanderAddIn; 

    public Window1() 
    { 
     InitializeComponent(); 

     m_stackPanel = new StackPanel { Orientation = Orientation.Vertical }; 
     m_stackPanel.Background = Brushes.Red; 
     m_expander = new Expander 
         { 
          ExpandDirection = ExpandDirection.Right, 
          Background=Brushes.Blue, 
          IsExpanded=true, 
         }; 
     m_expander.Expanded += CheckStuff; 
     m_expander.Collapsed += CheckStuff; 

     Rectangle r = new Rectangle {Fill = Brushes.LightGray, Height = 300, Width = 300}; 

     m_expander.Content = r; 

     m_expanderAddIn = FrameworkElementAdapters.ContractToViewAdapter(FrameworkElementAdapters.ViewToContractAdapter(m_expander)); 

     m_stackPanel.Children.Add(m_expanderAddIn); 

     Content = m_stackPanel; 
    } 

    private void CheckStuff(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("Expander: " + m_expander.DesiredSize); 
     Debug.WriteLine("Add in: " + m_expanderAddIn.DesiredSize); 
     Debug.WriteLine("Stack Panel: " + m_stackPanel.DesiredSize); 
    } 
} 

が、それはしていません。ここで

は、サンプルコード(XAMLはちょうど空のウィンドウである)です。どんなアイディアも役に立ちます。ありがとうございます。

答えて

0

これは本当に奇妙で、なぜそれがそのように動作するのかわかりません。これはたぶんあなたの問題を再現した小さな例に過ぎないので、これはあなたにはあまり役立たないかもしれませんが、私は3つの変更を加えたあなたの例を得ました。

  1. 「ダミー」StackPanelにエキスパンダーをラップし、その代わりにm_expanderAddInのルート要素として使用します。これはExpanderのHeight問題を解決しました。
  2. 変更m_expanderのActualHeightへ
  3. バインドm_expanderAddInの高さをするFrameworkElementするUIElementからm_expanderAddInの種類

コード

public partial class Window1 : Window 
{ 
    private StackPanel m_stackPanel; 
    private Expander m_expander; 

    private FrameworkElement m_expanderAddIn; 

    public Window1() 
    { 
     InitializeComponent(); 

     m_stackPanel = new StackPanel { Orientation = Orientation.Vertical }; 
     m_stackPanel.Background = Brushes.Red; 
     m_expander = new Expander 
         { 
          ExpandDirection = ExpandDirection.Right, 
          Background=Brushes.Blue, 
          IsExpanded=true, 
         }; 
     m_expander.Expanded += CheckStuff; 
     m_expander.Collapsed += CheckStuff; 

     Rectangle r = new Rectangle {Fill = Brushes.LightGray, Height = 300, Width = 300}; 

     m_expander.Content = r; 
     StackPanel stackPanel = new StackPanel(); 
     stackPanel.Children.Add(m_expander); 

     m_expanderAddIn = FrameworkElementAdapters.ContractToViewAdapter(FrameworkElementAdapters.ViewToContractAdapter(stackPanel)); 

     Binding binding = new Binding("ActualHeight"); 
     binding.Source = m_expander; 
     m_expanderAddIn.SetBinding(FrameworkElement.HeightProperty, binding); 

     m_stackPanel.Children.Add(m_expanderAddIn); 

     Content = m_stackPanel; 
    } 

    private void CheckStuff(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("Expander: " + m_expander.DesiredSize); 
     Debug.WriteLine("Add in: " + m_expanderAddIn.DesiredSize); 
     Debug.WriteLine("Stack Panel: " + m_stackPanel.DesiredSize); 
    } 
} 
+0

雅が、残念ながら、これはフルスケールのために動作しません 私たちの問題のバージョン。しかし、あなたのソリューションは印象的です。 –

関連する問題