0

UserControl我在一个 64中托管了一个列表ItemsControl,它DataContext是一个对象数组。那么DataContext对于个体的实例UserControl就变成了对象的实例。

这些对象有一个名为 的布尔变量Exists,这是一个 DataTemplate 触发器,用于确定是否Usercontrol将显示。

我使用 aUniformgrid来显示列表,但我遇到了一些奇怪的行为。Usercontrol不要调整大小。见附图。如果我改用 a StackPanel,它工作得很好。但我想UnifromGrid改用。

这是代码 - 只有 4 个对象将Exist变量设置为 true。

    <Grid Grid.Row="1" Grid.Column="1" x:Name="gridSome" Background="#FF5AC1F1">
        <Viewbox>
            <ItemsControl ItemsSource="{Binding SomeVM.SomeModel.SomeArray}"  
                          Margin="15" HorizontalAlignment="Center" VerticalContentAlignment="Center">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <tensioner:UCView  Margin="5"/>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding Exists}" Value="False">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <!--<StackPanel IsItemsHost="true"/> This works-->
                        <UniformGrid Columns="1"/> <!-- This does not work-->
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
             </ItemsControl>
        </Viewbox>
    </Grid>

统一网格

堆栈面板

- - -更新 - - -

//SSCCE主窗口

<Window x:Class="WpfAppItemIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppItemIssue"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <!--<Viewbox>-->
            <ItemsControl ItemsSource="{Binding Model.Cars}">
            <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBox Text="ABC"></TextBox>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding exists}" Value="False">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Columns="1"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        <!--</Viewbox>-->
    </Grid>
</Window>

主视图模型

using System.ComponentModel;

namespace WpfAppItemIssue
{
    class MainViewModel:INotifyPropertyChanged
    {

        public MainViewModel()
        {
            Model = new MainModel();
        }

        private MainModel model;
        public MainModel Model
        {
            get
            {
                return model;
            }
            set
            {
                model = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

模型

namespace WpfAppItemIssue
{
    class MainModel
    {
        public Car[] Cars { get; set; }

        public MainModel()
        {
            Cars = new Car[64];
            for (int i = 0; i < Cars.Length; i++)
            {
                Cars[i] = new Car(i);
            }
        }
    }

    internal class Car
    {
        public int someVal { get; set; }
        public bool exists { get; set; }

        public Car(int someVal)
        {
            this.someVal = someVal;
            if (someVal < 5)  //Just enable few items for debug
            {
                exists = true;
            }
            else
            {
                exists = false;
            }
        }
    }
}

见附图:

图 1 显示了设计视图。为什么不调整用户控件的大小?图 2 显示执行时。为什么不调整用户控件的大小?图 3 显示了任何调整大小事件。控件正在正确调整大小。 设计视图执行 调整大小

4

2 回答 2

1

这不是一个奇怪的行为,但它的UniformGrid工作方式。作为ItemsPanel中的一个ItemsControlUniformGrid使用ItemSource集合来确定行数和列数。放置在 中的项目是否可见无关紧要UniformGrid- 所有网格单元格都具有相同的宽度和高度。所以你DataTrigger对 的布局没有影响UniformGrid,它只会影响项目的可见性。

StackPanel作品以不同的方式。没有单元格,所有可见项目都以占据可用空间的方式StackPanel排列。

于 2017-06-13T15:13:22.413 回答
1

好吧,在评论中讨论后,我终于解决了您的问题。这一切都DataTrigger在您的ItemTemplate. 只需将其移动到ItemContainerStyle Triggers,元素就会正确调整大小。

<ItemsControl ItemsSource="{Binding Model.Cars}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="{x:Type ContentPresenter}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding exists}" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="ABC"></TextBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

请注意,TextBox'es 将仅“按边框”调整大小(此行为显示在您的最后一张图片上),字体大小不会更改。如果你想用它们的内容统一缩放你的元素,你真的需要换ItemsControl行到Viewbox.

于 2017-06-17T03:30:52.553 回答