基本的な問題は、グリッド スプリッターが左の列の幅のみを調整することによって機能し、右の列が残りのスペースに合わせて星形のサイズになると想定することです。
つまり、解決しようとしている問題は、実際には「右の列が小さくなりすぎないように、左の列の最大幅を制限するにはどうすればよいですか?」ということです。これは基本的にコードサンプルが行っていることです。
XAML で実装できる、より移植性の高いソリューションが必要な場合は、グリッドに適用できるSilverlight動作を作成します (以下を参照)。これは親グリッドのSizeChanged
イベントにアタッチされ、コード スニペットとほぼ同じように動作しますが、Blend でドラッグ アンド ドロップしたり、XAML でアタッチしたりできる動作です。
これは、例としてまとめたサンプル動作です (独自のコードに基づいています)。
MinWidthSplitterBehavior.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
namespace GridSplitterMinWidth
{
public class MinWidthSplitterBehavior : Behavior<Grid>
{
public Grid ParentGrid { get; set; }
protected override void OnAttached()
{
base.OnAttached();
ParentGrid = this.AssociatedObject as Grid;
ParentGrid.SizeChanged += parent_SizeChanged;
}
void parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (ParentGrid.ColumnDefinitions.Count == 3)
{
Double maxW = e.NewSize.Width - ParentGrid.ColumnDefinitions[2].MinWidth -
ParentGrid.ColumnDefinitions[1].ActualWidth;
ParentGrid.ColumnDefinitions[0].MaxWidth = maxW;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (ParentGrid != null)
{
ParentGrid.SizeChanged -= parent_SizeChanged;
}
}
}
}
次のように使用します。
<UserControl x:Class="GridSplitterMinWidthApp.MainPage"
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:GridSplitterMinWidth="clr-namespace:GridSplitterMinWidth"
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>
<interactivity:Interaction.Behaviors>
<GridSplitterMinWidth:MinWidthSplitterBehavior/>
</interactivity:Interaction.Behaviors>
<Rectangle Fill="Blue" />
<Controls:GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch">
</Controls:GridSplitter>
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>
</Grid>
</UserControl>