WPF UI AddIn не обновляет желаемый размер - PullRequest
1 голос
/ 30 декабря 2010

У меня есть приложение, которое получает один из своих элементов управления пользовательским интерфейсом через INativeHandleContract из другого домена приложения.При изменении размера элемента управления FrameworkElement на хосте не получает обновленный размер.Мне было интересно, есть ли способ исправить это.

Вот пример кода (XAML - просто пустое окно):

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);
    }
}

Когда вы разворачиваете и сворачиваете Expander, выожидал, что высота StackPanel изменится, но это не так.Любые идеи будут полезны, спасибо.

1 Ответ

0 голосов
/ 31 декабря 2010

Это действительно странно, и я понятия не имею, почему он так себя ведет. Вероятно, это всего лишь небольшой пример, воспроизводящий вашу проблему, так что, возможно, это вам мало поможет, но ваш пример работает с 3 изменениями.

  1. Оберните Expander в «фиктивную» StackPanel и используйте его в качестве корневого элемента для m_expanderAddIn. Это решило проблему высоты для расширителя.
  2. Изменить тип m_expanderAddIn с UIElement на FrameworkElement
  3. Привязать высоту m_expanderAddIn к фактической высоте m_expander

код

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...