我对一个不想调整大小的控件有一个相当奇怪的问题。 Bellow是用SL4编写的控件的XAML +代码。
因此,为了解释事情,控件有4个区域 - Header,Subheader,BodyContent和Footer。每个区域都由一个“Border”元素表示,该元素充当其嵌套子元素的容器。
这个控件只是为了统一我的应用程序的外观和感觉,并没有真正做任何逻辑。
我的问题是,如果我想使用该控件,我必须明确设置它的宽度。当使用Element-to-element绑定(到父容器)设置它的宽度时,控件甚至不呈现。
我还试图创建一个“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;
}
}
}
}
编辑:Bellow是在页面上使用此用户控件
<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>
答案 0 :(得分:0)
默认情况下,用户控件的大小调整不会设置为需要(因为外部网格行/列大小设置为“星形”)。
您可以选择插入控件。将HorizontalAlignment和VerticalAlignment设置为拉伸到外页中SL4.Learning.LayoutPanel对象的实例上。