Как обновить макет StackPanel? - PullRequest
4 голосов
/ 03 сентября 2011

Проблема заключается в том, что если вы нажмете кнопку и развернете номер телефона, панель стека и граница будут расширены, и это здорово, но если вы ее свернете, панель стека и граница не свернутся.

image


    
              

Со следующим кодом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            myListBox.ItemsSource = new List<int>() { 1, 2 }; //add 2 elements; 
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;

            StackPanel sp1 = VisualTreeHelper.GetParent(btn) as StackPanel;
            StackPanel sp2 = VisualTreeHelper.GetParent(sp1) as StackPanel;

            StackPanel phone = sp2.FindName("PhoneNumber") as StackPanel;

            if (phone.Visibility == System.Windows.Visibility.Collapsed)
                phone.Visibility = System.Windows.Visibility.Visible; 
            else
                phone.Visibility = System.Windows.Visibility.Collapsed;

            myListBox.UpdateLayout(); //these don't collapse my space
            this.UpdateLayout(); //these don't collapse my space
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Не углублялся в это, но, похоже, вам придется звонить InvalidateMeasure по всей цепочке до ItemsPresenter (на самом деле, ItemsPanelTemplate).Я обновлюсь, если смогу что-нибудь получше

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;

    StackPanel sp1 = VisualTreeHelper.GetParent(btn) as StackPanel;
    StackPanel sp2 = VisualTreeHelper.GetParent(sp1) as StackPanel;

    StackPanel phone = sp2.FindName("PhoneNumber") as StackPanel;

    if (phone.Visibility == System.Windows.Visibility.Collapsed)
        phone.Visibility = System.Windows.Visibility.Visible; 
    else
        phone.Visibility = System.Windows.Visibility.Collapsed;

    DependencyObject dpObject = btn;
    while (dpObject != null)
    {
        if (dpObject is UIElement)
        {
            (dpObject as UIElement).InvalidateMeasure();
        }
        if (dpObject is ItemsPresenter)
            break;
        dpObject = VisualTreeHelper.GetParent(dpObject);
    }
}
1 голос
/ 03 сентября 2011

Проблема в том, что Listbox использует виртуализацию.Если вы отключите это, то проблема исчезнет, ​​например так:

<ListBox x:Name="myListBox" BorderBrush="Black" BorderThickness="1">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

В качестве альтернативы, вы можете оставить панель ItemsPanel по умолчанию и установить ScrollViewer.CanContentScroll="False" в ListBox.И то, и другое отключает виртуализацию.

Мне кажется, этот вопрос связан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...