Как растянуть в ширину пользовательский элемент управления WPF в его окне?
У меня есть окно с моим пользовательским контролем, и я бы хотел, чтобы ширина usercontrol равнялась ширине окна. Как это сделать?
Пользовательский элемент управления представляет собой горизонтальное меню и содержит сетку с тремя столбцами:
<ColumnDefinition Name="LeftSideMenu" Width="433"/>
<ColumnDefinition Name="Middle" Width="*"/>
<ColumnDefinition Name="RightSideMenu" Width="90"/>
Именно поэтому я хочу ширину окна, чтобы растянуть пользовательский элемент управления до 100% ширины, со вторым относительным столбцом.
EDIT:
Я использую сетку, есть код для окна:
<Window x:Class="TCI.Indexer.UI.Operacao"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles"
Title=" " MinHeight="550" MinWidth="675" Loaded="Load" ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" Focusable="True"
x:Name="windowOperacao">
<Canvas x:Name="canv">
<Grid>
<tci:Status x:Name="ucStatus"/> <!-- the control which I want to stretch in width -->
</Grid>
</Canvas>
</Window>
Ответы
Ответ 1
Вам нужно убедиться, что ваш usercontrol не установил ширину в файле xaml usercontrol. Просто удалите Width = "...", и вы хорошо пойдете!
EDIT: Это код, который я тестировал с помощью:
SOUserAnswerTest.xaml:
<UserControl x:Class="WpfApplication1.SOAnswerTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="LeftSideMenu" Width="100"/>
<ColumnDefinition Name="Middle" Width="*"/>
<ColumnDefinition Name="RightSideMenu" Width="90"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0">a</TextBlock>
<TextBlock Grid.Column="1">b</TextBlock>
<TextBlock Grid.Column="2">c</TextBlock>
</Grid>
</UserControl>
Window1.xaml:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="415">
<Grid>
<local:SOAnswerTest Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2"/>
</Grid>
</Window>
Ответ 2
Canvas в WPF не обеспечивает много автоматической поддержки макета. Я стараюсь избегать их по этой причине (HorizontalAlignment и VerticalAlignment работают не так, как ожидалось), но я получил ваш код для работы с этими незначительными изменениями (привязка ширины и высоты элемента управления к холсту ActualWidth/ActualHeight).
<Window x:Class="TCI.Indexer.UI.Operacao"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles"
Title=" " MinHeight="550" MinWidth="675" Loaded="Load"
ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen"
WindowState="Maximized" Focusable="True" x:Name="windowOperacao">
<Canvas x:Name="canv">
<Grid>
<tci:Status x:Name="ucStatus" Width="{Binding ElementName=canv
, Path=ActualWidth}"
Height="{Binding ElementName=canv
, Path=ActualHeight}"/>
<!-- the control which I want to stretch in width -->
</Grid>
</Canvas>
Проблема с Canvas. Если вы на самом деле не используете функции, которые предлагает холст с точки зрения макета или "раздавливания" Z-Order (подумайте о команде flatten в PhotoShop), я бы подумал об использовании элемента управления, например Grid, чтобы вы не закончили чтобы узнать причуды элемента управления, который работает по-другому, чем вы ожидали от WPF.
Ответ 3
Является ли холст критически важным в вашем окне? Если нет, попробуйте удалить его и сохранить Grid в качестве основной панели. Холст не имеет размера, если не указано, в то время как Grid обычно занимает все свободное пространство. Внутри холста сетка не будет иметь доступного пространства.
Ответ 4
Выполняет ли настройку горизонтального выравнивания растягивание, а ширина в Auto для пользовательского элемента управления достигает желаемых результатов?
Ответ 5
В какой контейнер вы добавляете UserControl? Обычно, когда вы добавляете элементы управления в сетку, они будут растягиваться, чтобы заполнить доступное пространство (если их строка/столбец не ограничена определенной шириной).
Ответ 6
Вместо этого используйте ширину и высоту в пользовательских элементах управления, используйте MinHeight и MinWidth.
Затем вы можете хорошо настроить UC и сможете растягиваться внутри другого окна.
Ну, как я видел в WPF, Microsoft задумалась о свойствах и поведении Windows, но до сих пор я ничего не пропустил из форм окон olds, в WPF элементы управления есть, но в новой точке вид.
Ответ 7
Это сработало для меня.
не присваивайте UserControl ширину или высоту и не определяйте определение строки и столбца в родительском окне.
<UserControl x:Class="MySampleApp.myUC"
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"
>
<Grid>
</Grid>
</UserControl>
<Window xmlns:MySampleApp="clr-namespace:MySampleApp" x:Class="MySampleApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="auto" Width="auto" MinWidth="1000" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<MySampleApp:myUC Grid.Column="0" Grid.Row="0" />
</Grid>