简体   繁体   English

用户控件未调整大小

[英]User Control Not Resizing

I have a rather weird problem with a control that doesn't want to resize. 我对一个不想调整大小的控件有一个很奇怪的问题。 Bellow is the XAML + Code behind of the control written in SL4. 波纹管是用SL4编写的控件的XAML +代码。

So to explain things rather shortly, the control has 4 regions - Header, Subheader, BodyContent, and Footer. 因此,为了简短地说明,控件具有4个区域-Header,Subheader,BodyContent和Footer。 Each region is represented by a "Border" element which acts as a container for it's nested children. 每个区域都由“边界”元素表示,该元素充当其嵌套子代的容器。

This control is merely to unify the look and feel of my application and doesn't really do anything as far as logic. 该控件仅是为了统一我的应用程序的外观,而实际上并没有做任何逻辑上的事情。

My issue is that if I want to use that control i have to explicitly set it's width. 我的问题是,如果要使用该控件,则必须显式设置其宽度。 When setting it's width with Element-to-element binding (to a parent container) the control doesn't even render. 通过元素到元素的绑定(绑定到父容器)设置宽度时,控件甚至不会渲染。

I also tried to create a " public new double Width/Height" properties, where I'd set the width of the control itself and the width of the "ControlBorder" element. 我还尝试创建“ public new double Width / Height”属性,在其中设置控件本身的宽度和“ ControlBorder”元素的宽度。 Using this properties also makes the control not render at runtime :(. I also tried wiring the Size Changed event, but it kept giving me cyclic errors! 使用此属性还使控件无法在运行时呈现:(.。我也尝试连接Size Changed事件,但它不断给我带来周期性错误!

Any ideas on how to make this control more "resizable"? 关于如何使此控件更“可调整大小”的任何想法? The intended application is using it in a grid that employs a Grid Splitter. 预期的应用程序正在使用Grid Splitter的网格中使用它。 It's absolutely imperative that the control knows how to resize itself! 控件必须知道如何调整自身大小,这绝对是必要的!

Any help would be greatly appreciated! 任何帮助将不胜感激! Thanks 谢谢

Martin 马丁

<UserControl xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"  x:Class="SL4.Learning.LayoutPanel"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <UserControl.Resources>
        <SolidColorBrush x:Key="DarkBrush" Color="#7B4C4C4B"/>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Border x:Name="ControlBorder" Grid.Row="0" Grid.Column="0"  BorderBrush="{StaticResource DarkBrush}" BorderThickness="2" CornerRadius="4" Margin="2">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition x:Name="LayoutHeaderRow" Height="30"/>
                    <RowDefinition x:Name="LayoutSubHeaderRow" Height="30"/>
                    <RowDefinition x:Name="LayoutContentRow" Height="*"/>
                    <RowDefinition x:Name="LayoutFooterRow" Height="30"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Rectangle x:Name="PnlHeaderBackground" Grid.Row="0" Grid.Column="0" Fill="{StaticResource DarkBrush}"/>
                <toolkit:DockPanel Grid.Row="0" Grid.Column="0" LastChildFill="False">
                    <TextBlock x:Name="LblHeaderTitle" Text="Header Text" FontSize="12" Foreground="White" toolkit:DockPanel.Dock="Left" VerticalAlignment="Center" Margin="4,0,0,0"/>
                    <Border x:Name="HeaderBorder" toolkit:DockPanel.Dock="Right" BorderThickness="0" BorderBrush="Transparent" Margin="0" CornerRadius="0">

                    </Border>
                </toolkit:DockPanel>
                <Border x:Name="SubHeaderBorder" Grid.Row="1" Grid.Column="0" BorderThickness="0" BorderBrush="Transparent" Margin="0" CornerRadius="0">

                </Border>
                <Border x:Name="ContentBorder" Grid.Row="2" Grid.Column="0" BorderThickness="0" BorderBrush="Transparent" Margin="0" CornerRadius="0">

                </Border>
                <Border x:Name="FooterBorder" Grid.Row="3" Grid.Column="0" BorderThickness="0" BorderBrush="Transparent" Margin="0" CornerRadius="0">

                </Border>
            </Grid>
        </Border>
    </Grid>
</UserControl>

And the code behind: 以及后面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;

namespace SL4.Learning
{
    public partial class LayoutPanel : UserControl
    {
        public static readonly DependencyProperty BorderRadiusProperty = DependencyProperty.Register("BorderRadius", typeof(CornerRadius), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderTextProperty = DependencyProperty.Register("HeaderText", typeof(string), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderBackgroundProperty = DependencyProperty.Register("HeaderBackground", typeof(Brush), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderForegroundProperty = DependencyProperty.Register("HeaderForeground", typeof(Brush), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderFontSizeProperty = DependencyProperty.Register("HeaderFontSize", typeof(double), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderFontFamilyProperty = DependencyProperty.Register("HeaderFontFamily", typeof(FontFamily), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderFontWeightProperty = DependencyProperty.Register("HeaderFontWeight", typeof(FontWeight), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderFontStyleProperty = DependencyProperty.Register("HeaderFontStyle", typeof(FontStyle), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderFontStretchProperty = DependencyProperty.Register("HeaderFontStretch", typeof(FontStretch), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty HeaderContentProperty = DependencyProperty.Register("HeaderContent", typeof(UIElement), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty SubHeaderContentProperty = DependencyProperty.Register("SubHeaderContent", typeof(UIElement), typeof(KeystoneContentControl), null);
        public static readonly DependencyProperty BodyContentProperty = DependencyProperty.Register("BodyContent", typeof(UIElement), typeof(KeystoneContentControl), null); 
        public static readonly DependencyProperty FooterContentProperty = DependencyProperty.Register("FooterContent", typeof(UIElement), typeof(KeystoneContentControl), null); 

        public KeystoneContentControl()
        {
            InitializeComponent();

        }

        public new double Width
        {
            get { return this.Width; }
            set
            {
                this.Width = value;
                this.ControlBorder.Width = value;
            }
        }

        public new double Height
        {
            get { return this.Height; }
            set
            {
                 this.Height = value;                   
                 this.ControlBorder.Height = value;
            }
        }

        public new Brush BorderBrush
        {
            get { return this.ControlBorder.BorderBrush; }
            set { this.ControlBorder.BorderBrush = value; }
        }

        public new Thickness BorderThickness
        {
            get { return this.ControlBorder.BorderThickness; }
            set { this.ControlBorder.BorderThickness = value; }
        }

        public CornerRadius BorderRadius
        {
            get{ return (CornerRadius)this.GetValue(KeystoneContentControl.BorderRadiusProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.BorderRadiusProperty, value);
                this.ControlBorder.CornerRadius = value;
            }
        }

        public Brush HeaderBackground
        {
            get{ return (Brush)this.GetValue(KeystoneContentControl.HeaderBackgroundProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderBackgroundProperty, value);
                this.PnlHeaderBackground.Fill = value; 
            }
        }

        public Brush HeaderForeground
        {
            get{ return (Brush)this.GetValue(KeystoneContentControl.HeaderForegroundProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderForegroundProperty, value);
                this.LblHeaderTitle.Foreground = value;
            }
        }

        public double HeaderFontSize
        {
            get { return (double)this.GetValue(KeystoneContentControl.HeaderFontSizeProperty); }
            set
            {
                this.LblHeaderTitle.FontSize = value;
            }
        }

        public FontFamily HeaderFontFamily
        {
            get { return (FontFamily)this.GetValue(KeystoneContentControl.HeaderFontFamilyProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderFontFamilyProperty, value);
                this.LblHeaderTitle.FontFamily = value;
            }
        }

        public FontWeight HeaderFontWeight
        {
            get{ return (FontWeight)this.GetValue(KeystoneContentControl.HeaderFontWeightProperty); }
            set
            {
                this.SetValue(HeaderFontWeightProperty, value);
                this.LblHeaderTitle.FontWeight = value;
            }
        }

        public FontStyle HeaderFontStyle
        {
            get { return (FontStyle)this.GetValue(KeystoneContentControl.HeaderFontStyleProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderFontStyleProperty, value);
                this.LblHeaderTitle.FontStyle = value;
            }
        }

        public FontStretch HeaderFontStretch
        {
            get { return (FontStretch)this.GetValue(KeystoneContentControl.HeaderFontStretchProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderFontStretchProperty, value);
                this.LblHeaderTitle.FontStretch = value; 
            }
        }

        public string HeaderText
        {
            get { return (string)this.GetValue(KeystoneContentControl.HeaderTextProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderTextProperty, value);
                this.LblHeaderTitle.Text = value;
            }
        }

        public UIElement HeaderContent
        {
            get{ return (UIElement)this.GetValue(KeystoneContentControl.HeaderContentProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.HeaderContentProperty, value);
                this.HeaderBorder.Child = value;
            }
        }

        public UIElement SubHeaderContent
        {
            get{ return (UIElement)this.GetValue(KeystoneContentControl.SubHeaderContentProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.SubHeaderContentProperty, value);
                this.SubHeaderBorder.Child = value;
            }
        }

        public UIElement BodyContent
        {
            get { return (UIElement)this.GetValue(KeystoneContentControl.BodyContentProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.BodyContentProperty, value);
                this.ContentBorder.Child = value;
            }
        }

        public UIElement FooterContent
        {
            get{ return (UIElement)this.GetValue(KeystoneContentControl.FooterContentProperty); }
            set
            {
                this.SetValue(KeystoneContentControl.FooterContentProperty, value);
                this.FooterBorder.Child = value;
            }
        }
    }
}

EDIT: Bellow is the usage of this user control on a page 编辑:波纹管是页面上此用户控件的用法

<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  x:Class="SL4.Learning.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="600"
    d:DesignWidth="800"
    xmlns:my="clr-namespace:SL4.Learning">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="LeftCol" />
            <ColumnDefinition x:Name="RightCol" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition x:Name="RowHeight" />
        </Grid.RowDefinitions>
        <my:LayoutPanel Grid.Row="0" Grid.Column="0" Width="{Binding ElementName=LeftCol, Path=ActualWidth}" HorizontalAlignment="Left" x:Name="PnlLayout" VerticalAlignment="Top">
            <my:LayoutPanel.SubHeaderContent>
                <TextBlock x:Name="SubHeaderLabel" Text="SubHeader" FontWeight="Bold" VerticalAlignment="Center"/>
            </my:LayoutPanel.SubHeaderContent>
            <my:LayoutPanel.BodyContent>
                <TextBlock x:Name="LblContentText" Text="BodyContent"  VerticalAlignment="Center"/>
            </my:LayoutPanel.BodyContent>
            <my:LayoutPanel.FooterContent>
                <TextBlock x:Name="LblFooterText" Text="Footer"  VerticalAlignment="Center"/>
            </my:LayoutPanel.FooterContent>
        </my:LayoutPanel>
    </Grid>
</UserControl>

The sizing of a user control is not set to stretch by default which it would need (as your outer grid row/col size is set to "star"). 默认情况下,用户控件的大小未设置为拉伸(因为您的外部网格行/列大小设置为“星形”)。

It is an option where you insert your control. 这是插入控件的选项。 Set HorizontalAlignment and VerticalAlignment to Stretch on the instance of the SL4.Learning.LayoutPanel objects in your outer page. 在外页上的SL4.Learning.LayoutPanel对象实例上,将Horizo​​ntalAlignment和VerticalAlignment设置为Stretch。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM