Как растянуть пользовательский элемент управления 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
45
0
159 812
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

В какой контейнер вы добавляете 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>

Спасибо за внимание, Арьян. Здесь он тоже работает нормально, но в моем окне не установлено значение Width = "415", потому что оно предназначено для полноэкранного режима. Когда я устанавливаю ширину, она работает хорошо.

Victor Rodrigues 20.01.2009 22:43

Имеет ли холст решающее значение в вашем окне? Если нет, попробуйте удалить его и оставить сетку в качестве главной панели. 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 решила эту проблему за меня.

PRINCESS FLUFF 31.10.2010 18:44

Вместо этого используйте ширину и высоту в пользовательских элементах управления, используйте 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>

Другие вопросы по теме