Подтвердить что ты не робот

Как растянуть в ширину пользовательский элемент управления 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>
4b9b3361

Ответ 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>