Самая быстрая вещь, о которой я могу думать, в основном использует code-behind.
Это просто требует добавления имени к внешнему Grid
и TreeView
, из которого я удалил объявление стиля:
<Grid x:Name="MyGrid" Background="LightGray" >
...
<TreeView x:Name="MyTree" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
Затем в коде позади я добавил метод для изменения размера как заголовка, так и элемента каждого TreeViewItem
:
private void ResizeTree()
{
var MaxWidth = Convert.ToDouble(MyGrid.ColumnDefinitions[0].ActualWidth);
foreach (TreeViewItem item in MyTree.Items)
{
var Header = item.Header as TextBlock;
var Body = item.Items[0] as TextBlock;
Header.Width = MaxWidth - 30;
Body.Width = MaxWidth - 60;
}
}
Затем, используя это решение , я добавил вызов метода для изменения размера TreeView
, когда Window
отображается впервые:
private bool _shown = false;
public MainWindow()
{
InitializeComponent();
}
protected override void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
if (_shown)
{
return;
}
_shown = true;
ResizeTree();
}
В последний раз я добавил событие, которое будет вызвано при перемещении GridSplitter
:
<GridSplitter Grid.Column="1" DragCompleted="GridSplitter_DragCompleted"
Width="10" ResizeBehavior="PreviousAndNext" />
который, конечно, должен вызывать метод ResizeTree
:
private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
ResizeTree();
}
Другие вещи, с которыми возможно иметь дело, - изменение размера окна или использование другого поля для заголовка и элемента (я выбираю 30 и 60).