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

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

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

<ColumnDefinition Name="LeftSideMenu" Width="433"/>
<ColumnDefinition Name="Middle" Width="*"/>
<ColumnDefinition Name="RightSideMenu" Width="90"/>

Именно поэтому я хочу, чтобы ширина окна растянула пользовательский элемент управления до 100% ширины со вторым столбцом относительно.

EDIT:

Я использую сетку, есть код для 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>

Ответы [ 7 ]

43 голосов
/ 20 января 2009

Вы должны убедиться, что ваш usercontrol не установил свою ширину в файле xaml usercontrol. Просто удалите 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>
21 голосов
/ 22 января 2009

Canvas в WPF не обеспечивает особой автоматической поддержки макетов. По этой причине я стараюсь держаться подальше от них (HorizontalAlignment и VerticalAlignment не работают должным образом), но я заставил ваш код работать с этими незначительными изменениями (связывая Width и Height элемента управления с 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>

Холст - проблема здесь. Если вы на самом деле не используете функции, которые предлагает холст, с точки зрения макета или «сдавливания» Z-порядка (подумайте о команде flatten в PhotoShop), я бы подумал об использовании элемента управления, такого как Grid, чтобы вы не оказались в конечном итоге. необходимо изучить причуды элемента управления, который работает не так, как вы ожидаете от WPF.

7 голосов
/ 21 января 2009

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

2 голосов
/ 20 января 2009

Достигает ли установка горизонтального выравнивания на «Растяжение» и «Ширина» на «Авто» в пользовательском элементе управления желаемых результатов?

1 голос
/ 22 марта 2017

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

1 голос
/ 25 января 2010

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

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

1 голос
/ 20 января 2009

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

...