Как растянуть пользовательский элемент управления WPF по ширине до его окна?

У меня есть окно с моим пользовательским элементом управления, и я хотел бы, чтобы ширина пользовательского элемента управления равнялась ширине окна. Как это сделать?

Пользовательский элемент управления представляет собой горизонтальное меню и содержит сетку с тремя столбцами:

<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>

person Victor Rodrigues    schedule 20.01.2009    source источник


Ответы (7)


Вам нужно убедиться, что ваш пользовательский элемент управления не установил его ширину в 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>
person Arjan Einbu    schedule 20.01.2009
comment
Спасибо за внимание, Арьян. Здесь он тоже работает нормально, но в моем окне не установлено значение Width = 415, потому что оно предназначено для полноэкранного режима. Когда я устанавливаю ширину, она работает хорошо. - person Victor Rodrigues; 20.01.2009

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.

person Michael    schedule 22.01.2009
comment
Спасибо, привязка к ActualWidth помогла мне в проекте, где у меня был собственный UserControl в StackPanel. StackPanel использовал HorizontalAlignement = Stretch и взял всю ширину, но для пользовательского элемента управления оставалась ширина 0. Привязка пользовательского элемента управления к его родительской стековой панели ActualWidth решила эту проблему за меня. - person PRINCESS FLUFF; 31.10.2010

Имеет ли холст решающее значение в вашем окне? Если нет, попробуйте удалить его и оставить сетку в качестве главной панели. Холст не имеет размера, если не указано иное, в то время как сетка обычно занимает все доступное пространство. Внутри холста в сетке не будет свободного места.

person Bubblewrap    schedule 21.01.2009

Достигает ли установка HorizontalAlignment на Stretch и Width на Auto в пользовательском элементе управления желаемых результатов?

person Jason Miesionczek    schedule 20.01.2009

В какой контейнер вы добавляете UserControl? Обычно, когда вы добавляете элементы управления в сетку, они растягиваются, чтобы заполнить доступное пространство (если их строка / столбец не ограничен определенной шириной).

person Andy    schedule 20.01.2009

Вместо этого используйте ширину и высоту в пользовательских элементах управления, используйте MinHeight и MinWidth. Тогда вы сможете хорошо настроить UC и сможете растягиваться внутри другого окна.

Что ж, как я вижу в WPF, Microsoft переосмыслила свойства и поведение окон, но до сих пор я ничего не пропустил из старых форм Windows, в WPF элементы управления есть, но с новой точки зрения.

person Leonardo Nowaczyk    schedule 25.01.2010

Это сработало для меня. не назначайте ширину или высоту для 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>

person Shahid    schedule 22.03.2017