Как сделать ширину UIElement относительно родительского контейнера (в данном случае StackPanel)?

Как сделать UIElement (в моем случае это Line) ширина относительно родительского контейнера (в данном случае, StackPanel)? Относительные средства растягиваются и сжимаются на основе родителя.

<usercontrol x:class="RevisiConverter.NumericNote" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:ignorable="d" background="White">
<stackpanel name="mainStack">
 <stackpanel name="topStack">
 <line x1="0" y1="0" x2="20" y2="0" margin="0,2,0,2" stroke="Black">
 <line x1="0" y1="0" x2="20" y2="0" margin="0,2,0,2" stroke="Black">
 </line></line></stackpanel>
 <textblock name="txbNote" text="b5" foreground="Black" horizontalalignment="Center" verticalalignment="Center" fontsize="15">
 <stackpanel name="botStack">

 </stackpanel>
</textblock></stackpanel>
</usercontrol>

В вышеприведенном примере topStack уже заполняется 2x Line непосредственно из xaml, но на самом деле он заполняется из кода С# (начальное число Children topStack равно 0).

Размер UserControl относительно его Children, но всегда будет содержать как минимум 1 ребенка, txbNote, а txbNote всегда будет иметь по крайней мере 1 символ.

Короче говоря, мне нужна длина Line, если она существует, всегда равна ширине txbNote. Хотя txbNote может быть обновлен в любое время.

Как добиться этого, особенно с С# кода?

Спасибо.

3 ответа

И привязка к коду выглядит так:

var newLine = new Line();

// some newLine initializing

Binding binding = new Binding();
binding.Source = topStack;
binding.Path = new System.Windows.PropertyPath("ActualWidth");
newLine.SetBinding(Line.X2Property, binding);

topStack.Children.Add(newLine);


Важно понимать, что в WPF разные элементы управления контейнерами ведут себя по-разному. Существуют элементы Panel, такие как Grid, которые могут автоматически выполнять действия по изменению размера своих дочерних элементов, и есть другие элементы управления Panel, такие как StackPanel которые этого не делают. Лучше использовать правильное управление для работы, вместо того, чтобы пытаться сделать неправильный контроль, выполнять работу, которую он никогда не хотел делать.

В вашем случае я предлагаю вам заменить StackPanel на Grid и позволить им автоматически заполнять пространство для вас. Дополнительную информацию об этом см. на странице класса Grid в MSDN. Вы также можете узнать больше о различных Panel используемых в WPF на странице Обзор панелей в MSDN.


Привяжите X2 к ActualWidth TextBlock:

licensed under cc by-sa 3.0 with attribution.