繁体   English   中英

用户控件未调整大小

[英]User Control Not Resizing

我对一个不想调整大小的控件有一个很奇怪的问题。 波纹管是用SL4编写的控件的XAML +代码。

因此,为了简短地说明,控件具有4个区域-Header,Subheader,BodyContent和Footer。 每个区域都由“边界”元素表示,该元素充当其嵌套子代的容器。

该控件仅是为了统一我的应用程序的外观,而实际上并没有做任何逻辑上的事情。

我的问题是,如果要使用该控件,则必须显式设置其宽度。 通过元素到元素的绑定(绑定到父容器)设置宽度时,控件甚至不会渲染。

我还尝试创建“ public new double Width / Height”属性,在其中设置控件本身的宽度和“ ControlBorder”元素的宽度。 使用此属性还使控件无法在运行时呈现:(.。我也尝试连接Size Changed事件,但它不断给我带来周期性错误!

关于如何使此控件更“可调整大小”的任何想法? 预期的应用程序正在使用Grid Splitter的网格中使用它。 控件必须知道如何调整自身大小,这绝对是必要的!

任何帮助将不胜感激! 谢谢

马丁

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

以及后面的代码:

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

编辑:波纹管是页面上此用户控件的用法

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

默认情况下,用户控件的大小未设置为拉伸(因为您的外部网格行/列大小设置为“星形”)。

这是插入控件的选项。 在外页上的SL4.Learning.LayoutPanel对象实例上,将Horizo​​ntalAlignment和VerticalAlignment设置为Stretch。

暂无
暂无

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

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