为什么在拖动GridSplitter后触发器不起作用

时间:2016-12-07 07:19:14

标签: wpf xaml

由于项目隐私保护,我无法在此处粘贴产品代码。所以我做了一个简单的例子来说明问题。

我有一个这样的窗口: enter image description here

当我单击右键时,我希望右列隐藏和左列拉伸到完整窗口:

enter image description here

这是我的Xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="0"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition x:Name="rightCol" MinWidth="0"/>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0">
            <Button Height="100" Content="Left" />
        </StackPanel>

        <GridSplitter Grid.Column="1" Width="10" VerticalAlignment="Stretch" HorizontalAlignment="Center"/>
        <StackPanel x:Name="right" Grid.Column="2" >
            <Button Height="100" Content="Right" Click="Button_Click" />
        </StackPanel>

    </Grid>
</Window>

这是我的代码隐藏:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            var b = new Binding("Visibility")
            {
                Source = this.right
            };

            var style = new Style(typeof(ColumnDefinition))
            {
                Setters = 
                {
                    new Setter(ColumnDefinition.WidthProperty, new GridLength(300)),
                    new Setter(ColumnDefinition.MinWidthProperty, 0.0),
                }
            };

            style.Triggers.Add(new DataTrigger()
            {
                Binding = b,
                Value = System.Windows.Visibility.Collapsed,
                Setters = 
                    { 
                        new Setter(ColumnDefinition.WidthProperty, new GridLength(0)),
                        new Setter(ColumnDefinition.MaxWidthProperty, double.PositiveInfinity),
                        new Setter(ColumnDefinition.MinWidthProperty, 0.0),
                    }
            });

            this.rightCol.Style = style;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.right.Visibility = System.Windows.Visibility.Collapsed;
        }
    }

当我运行它并单击右键时,它工作正常。但如果我在单击右键之前拖动GridSplitter ,则触发器不起作用: enter image description here

为什么会这样?

注意: 如果我使用下面的代码,它可以工作。

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.right.Visibility = System.Windows.Visibility.Collapsed;
    this.rightCol.Width = new GridLength(0);
}

但有没有办法使用触发器?

1 个答案:

答案 0 :(得分:0)

我从这个链接得到了答案: GridSplitter overrides ColumnDefinition's style trigger?

所以下面的代码工作正常:

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            var b = new Binding("Visibility")
            {
                Source = this.rightPane,
                Mode = BindingMode.OneWay
            };

            var style = new Style(typeof(ColumnDefinition))
            {
                Setters = 
                {
                    new Setter(ColumnDefinition.WidthProperty, new GridLength(300)),
                    new Setter(ColumnDefinition.MinWidthProperty, 0.0),
                }
            };

            /*
            style.Triggers.Add(new DataTrigger()
            {
                Binding = b,
                Value = System.Windows.Visibility.Collapsed,
                Setters = 
                    { 
                        new Setter(ColumnDefinition.WidthProperty, new GridLength(0)),
                        new Setter(ColumnDefinition.MaxWidthProperty, double.PositiveInfinity),
                        new Setter(ColumnDefinition.MinWidthProperty, 0.0),
                    }
            });*/
            Storyboard sb = new Storyboard();
            ObjectAnimationUsingKeyFrames oaf = new ObjectAnimationUsingKeyFrames();
            DiscreteObjectKeyFrame disobj = new DiscreteObjectKeyFrame();
            disobj.KeyTime = TimeSpan.FromMilliseconds(0);
            disobj.Value = GridLength.Auto;
            oaf.KeyFrames.Add(disobj);
            sb.Children.Add(oaf);
            Storyboard.SetTargetProperty(oaf, new PropertyPath(ColumnDefinition.WidthProperty));

            var actionBegin = new BeginStoryboard();
            actionBegin.Storyboard = sb;
            actionBegin.Name="BeginStoryboard1";

            var actionEnd = new RemoveStoryboard();
            actionEnd.BeginStoryboardName = "BeginStoryboard1";

            var trigger = new DataTrigger()
            {
                Binding = b,
                Value = System.Windows.Visibility.Collapsed
            };

            trigger.EnterActions.Add(actionBegin);
            trigger.ExitActions.Add(actionEnd);
            style.Triggers.Add(trigger);
            style.RegisterName(actionBegin.Name, actionBegin);
            this.rightCol.Style = style;
        }