ツールバーのようなコントロールでレイアウトを行っているので、十分なスペースがない場合はボタンのテキストを非表示にする必要があります。私はすでにWindowsフォームでこれを正常に実行しており、このロジックをWPFに移植しました。しかし、ここには大きな問題があります。アルゴリズムが正しく機能するためには、コンテナーコントロールの目的の幅(すべてが表示されている場合に必要なサイズを知るため)とコントロールの実際の幅(方法を知るため)を知る必要があります。幅が広いので、希望の幅に十分なスペースがあるかどうか)。時々少し後ろ向きですが、最初のものが利用可能です。(必要以上に使用可能なスペースがある場合は、DesiredSizeを増やしてすべてを埋めますが、それより少なくても問題ありません。)後者は完全に使用できません。
私はActualWidthで試しましたが、グリッドがウィンドウよりも広い場合、ActualWidthは実際に表示されているよりも大きくなります。ですから、これはすでに間違っているに違いありません。次にRenderSizeを試しましたが、同じです。Measure呼び出しの後にArrangeを使用すると、さらに奇妙になります。
コントロールが実際にどれだけ広いかを知る必要があります。それ自体がどれだけ広いと信じているかではありません。そのサイズをどのように判断できますか?
更新:さて、ここにいくつかのコードがあります。この質問はすでにかなり長く、まだ不完全です。これは、ウィンドウのコードビハインドによるものです。
private void ToolGrid_LayoutUpdated(object sender, EventArgs e)
{
AutoCollapseItems();
}
private void AutoCollapseItems()
{
if (collapsingItems) return;
if (ToolGrid.ActualWidth < 10) return; // Something is wrong
try
{
collapsingItems = true;
// Collapse toolbar items in their specified priority to save space until all items
// fit in the toolbar. When collapsing, the item's display style is reduced from
// image and text to image-only. This is only applied to items with a specified
// collapse priority.
Dictionary<ICollapsableToolbarItem, int> collapsePriorities = new Dictionary<ICollapsableToolbarItem, int>();
// Restore the display style of all items that have a collpase priority.
var items = new List<ICollapsableToolbarItem>();
EnumCollapsableItems(ToolGrid, items);
foreach (var item in items)
{
if (item.CollapsePriority > 0)
{
item.ContentVisibility = Visibility.Visible;
collapsePriorities[item] = item.CollapsePriority;
}
}
// Group all items by their descending collapse priority and set their display style
// to image-only as long as all items don't fit in the toolbar.
var itemGroups = from kvp in collapsePriorities
where kvp.Value > 0
group kvp by kvp.Value into g
orderby g.Key descending
select g;
foreach (var grp in itemGroups)
{
//ToolGrid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
//ToolGrid.Arrange(new Rect(ToolGrid.DesiredSize));
//ToolGrid.UpdateLayout();
System.Diagnostics.Debug.WriteLine("Desired=" + ToolGrid.DesiredSize.Width + ", Actual=" + ToolGrid.ActualWidth);
if (ToolGrid.DesiredSize.Width <= ToolGrid.ActualWidth) break;
foreach (var kvp in grp)
{
kvp.Key.ContentVisibility = Visibility.Collapsed;
}
}
//ToolGrid.UpdateLayout();
}
finally
{
collapsingItems = false;
}
}
その他のコード:ウィンドウXAMLの一部は次のとおりです。
<Window>
<DockPanel>
<Grid Name="ToolGrid" DockPanel.Dock="Top" LayoutUpdated="ToolGrid_LayoutUpdated">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
...
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>