Изменение размера панелей в зависимости от размера пользовательского элемента управления - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь найти способ изменить размер LayoutPanel (DevExpress) в зависимости от размера пользовательского элемента управления, который он содержит.Пользовательский элемент управления предоставляется с помощью ContentControl.Вот соответствующий код. Это панель Layout и представление coresponding:

<dxd:LayoutPanel Caption="Search Criteria" CaptionImage="Images/Icons/DetailView.png">
   <ContentControl Name="myContentControl" Content="{Binding Path=ProjectsSearchVM}"/>
 </dxd:LayoutPanel>

ProjectSearchVM является свойством MainWindowViewModel, который является DataContext для приведенного выше кода.Это свойство возвращает объект типа ProjectsSearchViewModel, который заменяется его соответствующим представлением (содержащим userControl) с использованием файла ресурсов:

<DataTemplate DataType="{x:Type vm:ProjectSearchViewModel}">
  <vw:ProjectSearchView />
</DataTemplate>

Проблема заключается в том, что мое представление превышает исходный размер панели макетов,Я хотел бы привязать MinSize панели к размеру моего представления (или ContentControl, содержащего его).

Я пробовал это, но это не работает:

<dxd:LayoutPanel Caption="Search Criteria" CaptionImage="Images/Icons/DetailView.png">
  <dxd:LayoutPanel.MinSize>
    <Binding ElementName="myContentControl" Path="Size"/>
  </dxd:LayoutPanel.MinSize>


   <ContentControl Name="myContentControl" Content="{Binding Path=ProjectsSearchVM}" />
</dxd:LayoutPanel>

Я все еще плохо знаком с WPF, поэтому я уверен, что решение простое.Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2012

На вопрос DevExpress ответили по этой ссылке:

http://www.devexpress.com/Support/Center/Question/Details/Q448884

Для всплывающего окна это включает переопределение элемента управления в контейнере, например, если он находится в Border, что-то вроде этого:

public class AutoSizeContainer : Border {
        protected override void OnInitialized(EventArgs e) {
            base.OnInitialized(e);
            BaseLayoutItem item = DockLayoutManager.GetLayoutItem(this);
            Child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            AutoHideGroup.SetAutoHideSize(item, new Size(Child.DesiredSize.Width + 6, Child.DesiredSize.Height + 6));
        }
    }

Если сделать такой объект корневым объектом LayoutPanel в группе AutoHide, размер выпадающего меню будет правильным.

0 голосов
/ 30 июня 2011

Я не знаком с DevExpress LayoutPanel, но большинство стандартных панелей WPF (Grid, StackPanel) имеют «автоматический размер», чтобы содержать их дочерние элементы.Вы устанавливаете жесткие свойства высоты и ширины для LayoutPanel (или она содержит только свойство размера, а не высоту и ширину, как стандартные элементы управления WPF)?

Если вы вынуждены использовать жесткие значения высоты / ширины,Обычный способ их связывания будет выглядеть так:

<dxd:LayoutPanel ... Height="{Binding Height, ElementName=myContentControl}" Width="{Binding Width, ElementName=myContentControl}">
   <ContentControl x:Name=myContentControl ... />
</dxd:LayoutPanel>

Обычно, если вы связываете высоты и ширины, которые привязываете к ActualHeight или ActualWidth, но эти свойства не существуют в ContentControl.(Высота и ширина - это только рекомендуемые значения, поэтому вы можете обнаружить, что если вышеуказанная привязка необходима и работает для вас, вам может потребоваться слегка настроить значения с помощью преобразователя значений для учета полей или отступов).

...