2

3 つの行を含むがGridあり、3 番目の行の可視性はブール値にバインドされています。

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="120"/>
        <RowDefinition Height="*" />
        <RowDefinition>
            <RowDefinition.Style>
                <Style TargetType="{x:Type RowDefinition}">
                    <Setter Property="Height"
              Value="0.35*" />
                    <Style.Triggers>
                       <DataTrigger Binding="{Binding ElementName=plotter2, Path=Visibility}" Value="Collapsed">
                            <Setter Property="Height"  Value="0" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </RowDefinition.Style>
        </RowDefinition>

私も持っていGridSplitterます:

 <GridSplitter
                ResizeDirection="Rows"
                ResizeBehavior="BasedOnAlignment"
                Grid.Column="0"
                Grid.ColumnSpan="2"
                Grid.Row="2"             
                Width="Auto"
                Height="6"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Top"
                Margin="0 20 0 0"
                Background="Transparent"/>

これの目的は、クリックするCheckboxと最後の行が表示され、2 番目の 35% を占めるようにすることですが、GridSplitter. Checkboxがチェックされていない場合、その行の可視性はCollapsedです。

問題はGridSplitter、新しい高さを使用すると初期のスタイル定義が上書きCheckboxされ、チェックを外すと最後の行が表示されたままになることです。

これについては何もわかりません。誰かヒントを教えてもらえますか?ありがとう

4

1 に答える 1

4

DependencyPropertyHelper.GetValueSource(Rowdefinition.HeightProperty) を使用すると、最初はプロパティ値がスタイルによって設定されていることがわかりますが、GridSplitter が行の高さを変更した後、高さプロパティには「ローカル」値があります。ローカル値は、依存値の他のすべてのソースよりも優先されるため、データ トリガーが高さプロパティを 0 に設定しようとしても、何も起こりません。

これに加えて、GridSplitter はその上の行の高さを設定し、相対 (スター) 値が含まれるとすぐに、高さの設定はやや不親切に見えます。

この問題を回避するために私が見つけた方法は次のとおりです。

行を非表示にするときは、高さを 0 に設定する前に高さプロパティの値をクリアしてください

行を表示するときに、上の行の高さプロパティの値をクリアして、高さを初期値にリセットします。

この 2 番目のステップは、私にとって最大の頭痛の種でした。GridSplitter によって設定される「不適切な」高さの値は、たとえば 181.7634545* のようになります。一番下の行をもう一度表示したい場合に、高さを 0.35* にすると、高さが数ピクセルしかないため、表示されていないように見えます!

残念ながら、これをすべて XAML で行う方法は見つかりませんでした。この解決策は、影響を受ける 2 つの行の高さを適切なタイミングでプログラムによってリセットすることに依存しています。

テキストがはっきりしない場合のために、これをテストするために使用したコードを次に示します。

MainWindow.cs.xaml:

<Window x:Class="GridRowHidingSample.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.RowDefinitions>
        <RowDefinition Height="120" />
        <RowDefinition Name="TopRow" />
        <RowDefinition Name="BottomRow">
            <RowDefinition.Style>
                <Style TargetType="{x:Type RowDefinition}">
                    <Setter Property="Height" Value="0.35*" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsRowVisible, Mode=OneWay}" Value="False">
                            <Setter Property="Height"  Value="0" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </RowDefinition.Style>
        </RowDefinition>
    </Grid.RowDefinitions>
    <Border Background="Yellow">
        <CheckBox Content="Show bottom row" HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="{Binding Path=IsRowVisible, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10" />
    </Border>
    <Border Background="Red" Grid.Row="1">
    </Border>
    <Border Grid.Row="2" Background="Green">
    </Border>
    <GridSplitter Grid.Row="2" Height="10" HorizontalAlignment="Stretch" VerticalAlignment="Top" Background="DarkGray" Margin="0,20,0,0" />
</Grid>

MainWindow.cs:

using System.Windows;

namespace GridRowHidingSample
{
    public partial class MainWindow : Window
    {
        private MainWindowViewModel _viewModel;

        public MainWindow()
        {
            InitializeComponent();

            _viewModel = new MainWindowViewModel(TopRow, BottomRow);
            DataContext = _viewModel;
        }
    }
}

そして最後にビューモデル。重要なのは、メソッドとメソッドが呼び出されるResetHeight()プロパティです。IsRowVisible

MainWindowViewModel.cs:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace GridRowHidingSample
{
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        private RowDefinition _topRow;
        private RowDefinition _bottomRow;
        private bool _isRowVisible = false;

        public MainWindowViewModel(RowDefinition topRow, RowDefinition bottomRow)
        {
            _topRow = topRow;
            _bottomRow = bottomRow;
        }

        private void ResetHeight(RowDefinition rowDefinition)
        {
            if (rowDefinition != null)
            {
                if (DependencyPropertyHelper.GetValueSource(rowDefinition, RowDefinition.HeightProperty).BaseValueSource == BaseValueSource.Local)
                rowDefinition.ClearValue(RowDefinition.HeightProperty);
            }
        }

        public bool IsRowVisible
        {
            get { return _isRowVisible; }
            set
            {
                if (_isRowVisible != value)
                {
                    _isRowVisible = value;
                    NotifyPropertyChanged("IsRowVisible");

                    if (_isRowVisible)
                        ResetHeight(_topRow);
                    else
                        ResetHeight(_bottomRow);
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

別の解決策をまだ見つけていない場合は、これが役立つことを願っています。

于 2013-09-27T15:51:24.830 に答える