У меня есть окно с моим пользовательским элементом управления, и я хотел бы, чтобы ширина пользовательского элемента управления была равна ширине окна. Как это сделать?
Пользовательский элемент управления представляет собой горизонтальное меню и содержит сетку с тремя столбцами:
<ColumnDefinition Name = "LeftSideMenu" Width = "433"/>
<ColumnDefinition Name = "Middle" Width = "*"/>
<ColumnDefinition Name = "RightSideMenu" Width = "90"/>
По этой причине мне нужна ширина окна, чтобы растянуть пользовательский элемент управления до 100% ширины со вторым столбцом относительно.
Обновлено:
Я использую сетку, есть код для Window:
<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>





В какой контейнер вы добавляете UserControl? Обычно, когда вы добавляете элементы управления в сетку, они растягиваются, чтобы заполнить доступное пространство (если их строка / столбец не ограничен определенной шириной).
Достигает ли установка HorizontalAlignment на Stretch и Width на Auto в пользовательском элементе управления желаемых результатов?
Вам нужно убедиться, что ваш пользовательский элемент управления не установил его ширину в xaml-файле пользовательского элемента управления. Просто удалите из него Width = "...", и все готово!
Обновлено: Это код, с которым я его тестировал:
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>
Имеет ли холст решающее значение в вашем окне? Если нет, попробуйте удалить его и оставить сетку в качестве главной панели. Canvas не имеет размера, если не указано иное, в то время как Grid обычно занимает все доступное пространство. Внутри холста в сетке не будет свободного места.
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-порядка (подумайте о команде Flatten в PhotoShop), я бы подумал об использовании элемента управления, такого как сетка, чтобы вы не закончили необходимость изучить особенности элемента управления, который работает не так, как вы ожидали с WPF.
Спасибо, привязка к ActualWidth помогла мне в проекте, где у меня был собственный UserControl в StackPanel. StackPanel использовал HorizontalAlignement = Stretch и взял всю ширину, но для пользовательского элемента управления оставалась ширина 0. Привязка пользовательского элемента управления к его родительской стековой панели ActualWidth решила эту проблему за меня.
Вместо этого используйте ширину и высоту в пользовательских элементах управления, используйте MinHeight и MinWidth. Тогда вы сможете хорошо настроить UC и сможете растягиваться внутри другого окна.
Что ж, как я вижу в WPF, Microsoft пересмотрела свойства и поведение окон, но пока я ничего не пропустил из старых форм Windows, в WPF элементы управления есть, но с новой точки зрения.
Это сработало для меня. не назначайте ширину или высоту 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>
Спасибо за внимание, Арьян. Здесь он тоже работает нормально, но в моем окне не установлено значение Width = "415", потому что оно предназначено для полноэкранного режима. Когда я устанавливаю ширину, она работает хорошо.