DependencyProperty typeof GridLength 未将值 "Auto" 传递给 CustomControl 中的 ChildElement
DependencyProperty typeof GridLength is not passing value "Auto" to ChildElement in CustomControl
我正在构建一个带有一些 DependencyProperty 的 CustomControl。
这是一个用于浏览路径的简单控件,包含一个标签、一个文本框和一个按钮。
我想分别设置标签、文本框和按钮的宽度。
所以我为他们添加了一些 DependencyProperty。
namespace DDD.AutoRadio.General.UserControls
{
/// <summary>
/// Interaction logic for PathBrowser.xaml
/// </summary>
public partial class PathBrowser : UserControl
{
public PathBrowser() { InitializeComponent(); }
public static DependencyProperty labelContent = DependencyProperty.Register("LabelContent", typeof(string), typeof(PathBrowser));
public static DependencyProperty labelWidth = DependencyProperty.Register("LabelWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(GridLength.Auto, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty buttonContent = DependencyProperty.Register("ButtonContent", typeof(string), typeof(PathBrowser),
new FrameworkPropertyMetadata("Blader",FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty buttonWidth = DependencyProperty.Register("ButtonWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(default(GridLength), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty textBoxText = DependencyProperty.Register("UrlPath", typeof(string), typeof(PathBrowser),
new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,null,null,false,UpdateSourceTrigger.PropertyChanged));
public static DependencyProperty textBoxWidth = DependencyProperty.Register("UrlPathWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(GridLength.Auto, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty typeBrowser = DependencyProperty.Register("TypeBrowser", typeof(BrowserType), typeof(PathBrowser),
new FrameworkPropertyMetadata(BrowserType.Directory, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public enum BrowserType { Directory,File}
public string LabelContent
{
get { return (string)GetValue(labelContent); }
set { SetValue(labelContent, value); }
}
public GridLength LabelWidth
{
get { return (GridLength)GetValue(labelWidth); }
set { SetValue(labelWidth, value); }
}
public string ButtonContent
{
get { return (string)GetValue(buttonContent); }
set { SetValue(buttonContent, value); }
}
public GridLength ButtonWidth
{
get { return (GridLength)GetValue(buttonWidth); }
set { SetValue(buttonWidth, value); }
}
public string UrlPath
{
get { return (string)GetValue(textBoxText); }
set { SetValue(textBoxText, value); }
}
public GridLength UrlPathWidth
{
get { return (GridLength)GetValue(textBoxWidth); }
set { SetValue(textBoxWidth, value); }
}
public BrowserType TypeBrowser
{
get { return (BrowserType)GetValue(typeBrowser); }
set { SetValue(typeBrowser, value); }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (TypeBrowser == BrowserType.Directory)
{
System.Windows.Forms.FolderBrowserDialog op = new System.Windows.Forms.FolderBrowserDialog();
op.SelectedPath = UrlPath;
if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
UrlPath = System.IO.Path.GetFullPath(op.SelectedPath);
}
}
if (TypeBrowser==BrowserType.File)
{
System.Windows.Forms.OpenFileDialog fd = new System.Windows.Forms.OpenFileDialog();
try { fd.InitialDirectory = System.IO.Path.GetDirectoryName(UrlPath); } catch { }
fd.Multiselect = false;
if (fd.ShowDialog()== System.Windows.Forms.DialogResult.OK)
{
UrlPath = System.IO.Path.GetFullPath(fd.FileName);
}
}
}
}
这里是我的 CustomControl 的 XML 代码:
<UserControl x:Class="DDD.AutoRadio.General.UserControls.PathBrowser"
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"
xmlns:local="clr-namespace:DDD.AutoRadio.General.UserControls"
mc:Ignorable="d" Name="Root"
d:DesignHeight="24" d:DesignWidth="300">
<DockPanel LastChildFill="True">
<Label DockPanel.Dock="Left" Padding="2" Margin="3" Content="{Binding LabelContent,ElementName=Root}"
Width="{Binding LabelWidth,ElementName=Root}"/>
<Button DockPanel.Dock="Right" Padding="2" Margin="3" Content="{Binding ButtonContent,ElementName=Root}"
Width="{Binding ButtonWidth,ElementName=Root}" Click="Button_Click"/>
<TextBox Padding="2" Margin="3" Text="{Binding UrlPath,ElementName=Root}" Width="{Binding UrlPathWidth,ElementName=Root}" />
</DockPanel>
</UserControl>
所有与字符串类型的 DependencyProperty 的绑定都工作正常,但宽度 属性 保持值 "auto"。
我用一个转换器进行了测试,设置为 DP "LabelWidth" 的值“200”以 {200} 的形式出现(当我将鼠标悬停在 'value' 上时,当转换器中的断点命中时)但是标签不变。
当我将GridLength
更改为Double
时,我无法将其设置为Auto
Label
classWidth
属性的类型是double
。所以,你的 LabelWidth
也应该是 double
而不是 GridLength
类型。
终于找到答案了
我需要在 属性 Width
之前添加属性 [TypeConverterAttribute(typeof(LengthConverter))]
。
[TypeConverterAttribute(typeof(LengthConverter))]
public Double LabelWidth
{
get { return (Double)GetValue(labelWidth); }
set { SetValue(labelWidth, value); }
}
然后我将 DependencyProperty
更改为:
public static DependencyProperty labelWidth = DependencyProperty.Register("LabelWidth", typeof(Double), typeof(PathBrowser),
new FrameworkPropertyMetadata(Double.NaN, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
然后我可以将 LabelWidth 设置为 Auto
:
<local:PathBrower LabelWidth="Auto" />
(STL)
我的解决方案
public static readonly DependencyProperty ItemHeightProperty =
DependencyProperty.Register(
"ItemHeight",
typeof (GridLength),
typeof (TreeViewItem),
new FrameworkPropertyMetadata(new GridLength(30)));
/// <summary>
/// Indique si un overlay est présent
/// </summary>
public GridLength ItemHeight
{
get
{
return (GridLength)GetValue(ItemHeightProperty);
}
set
{
SetValue(ItemHeightProperty, value);
}
}
我正在构建一个带有一些 DependencyProperty 的 CustomControl。 这是一个用于浏览路径的简单控件,包含一个标签、一个文本框和一个按钮。
我想分别设置标签、文本框和按钮的宽度。 所以我为他们添加了一些 DependencyProperty。
namespace DDD.AutoRadio.General.UserControls
{
/// <summary>
/// Interaction logic for PathBrowser.xaml
/// </summary>
public partial class PathBrowser : UserControl
{
public PathBrowser() { InitializeComponent(); }
public static DependencyProperty labelContent = DependencyProperty.Register("LabelContent", typeof(string), typeof(PathBrowser));
public static DependencyProperty labelWidth = DependencyProperty.Register("LabelWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(GridLength.Auto, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty buttonContent = DependencyProperty.Register("ButtonContent", typeof(string), typeof(PathBrowser),
new FrameworkPropertyMetadata("Blader",FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty buttonWidth = DependencyProperty.Register("ButtonWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(default(GridLength), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty textBoxText = DependencyProperty.Register("UrlPath", typeof(string), typeof(PathBrowser),
new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,null,null,false,UpdateSourceTrigger.PropertyChanged));
public static DependencyProperty textBoxWidth = DependencyProperty.Register("UrlPathWidth", typeof(GridLength), typeof(PathBrowser),
new FrameworkPropertyMetadata(GridLength.Auto, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty typeBrowser = DependencyProperty.Register("TypeBrowser", typeof(BrowserType), typeof(PathBrowser),
new FrameworkPropertyMetadata(BrowserType.Directory, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public enum BrowserType { Directory,File}
public string LabelContent
{
get { return (string)GetValue(labelContent); }
set { SetValue(labelContent, value); }
}
public GridLength LabelWidth
{
get { return (GridLength)GetValue(labelWidth); }
set { SetValue(labelWidth, value); }
}
public string ButtonContent
{
get { return (string)GetValue(buttonContent); }
set { SetValue(buttonContent, value); }
}
public GridLength ButtonWidth
{
get { return (GridLength)GetValue(buttonWidth); }
set { SetValue(buttonWidth, value); }
}
public string UrlPath
{
get { return (string)GetValue(textBoxText); }
set { SetValue(textBoxText, value); }
}
public GridLength UrlPathWidth
{
get { return (GridLength)GetValue(textBoxWidth); }
set { SetValue(textBoxWidth, value); }
}
public BrowserType TypeBrowser
{
get { return (BrowserType)GetValue(typeBrowser); }
set { SetValue(typeBrowser, value); }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (TypeBrowser == BrowserType.Directory)
{
System.Windows.Forms.FolderBrowserDialog op = new System.Windows.Forms.FolderBrowserDialog();
op.SelectedPath = UrlPath;
if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
UrlPath = System.IO.Path.GetFullPath(op.SelectedPath);
}
}
if (TypeBrowser==BrowserType.File)
{
System.Windows.Forms.OpenFileDialog fd = new System.Windows.Forms.OpenFileDialog();
try { fd.InitialDirectory = System.IO.Path.GetDirectoryName(UrlPath); } catch { }
fd.Multiselect = false;
if (fd.ShowDialog()== System.Windows.Forms.DialogResult.OK)
{
UrlPath = System.IO.Path.GetFullPath(fd.FileName);
}
}
}
}
这里是我的 CustomControl 的 XML 代码:
<UserControl x:Class="DDD.AutoRadio.General.UserControls.PathBrowser"
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"
xmlns:local="clr-namespace:DDD.AutoRadio.General.UserControls"
mc:Ignorable="d" Name="Root"
d:DesignHeight="24" d:DesignWidth="300">
<DockPanel LastChildFill="True">
<Label DockPanel.Dock="Left" Padding="2" Margin="3" Content="{Binding LabelContent,ElementName=Root}"
Width="{Binding LabelWidth,ElementName=Root}"/>
<Button DockPanel.Dock="Right" Padding="2" Margin="3" Content="{Binding ButtonContent,ElementName=Root}"
Width="{Binding ButtonWidth,ElementName=Root}" Click="Button_Click"/>
<TextBox Padding="2" Margin="3" Text="{Binding UrlPath,ElementName=Root}" Width="{Binding UrlPathWidth,ElementName=Root}" />
</DockPanel>
</UserControl>
所有与字符串类型的 DependencyProperty 的绑定都工作正常,但宽度 属性 保持值 "auto"。
我用一个转换器进行了测试,设置为 DP "LabelWidth" 的值“200”以 {200} 的形式出现(当我将鼠标悬停在 'value' 上时,当转换器中的断点命中时)但是标签不变。
当我将GridLength
更改为Double
时,我无法将其设置为Auto
Label
classWidth
属性的类型是double
。所以,你的 LabelWidth
也应该是 double
而不是 GridLength
类型。
终于找到答案了
我需要在 属性 Width
之前添加属性 [TypeConverterAttribute(typeof(LengthConverter))]
。
[TypeConverterAttribute(typeof(LengthConverter))]
public Double LabelWidth
{
get { return (Double)GetValue(labelWidth); }
set { SetValue(labelWidth, value); }
}
然后我将 DependencyProperty
更改为:
public static DependencyProperty labelWidth = DependencyProperty.Register("LabelWidth", typeof(Double), typeof(PathBrowser),
new FrameworkPropertyMetadata(Double.NaN, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
然后我可以将 LabelWidth 设置为 Auto
:
<local:PathBrower LabelWidth="Auto" />
(STL) 我的解决方案
public static readonly DependencyProperty ItemHeightProperty =
DependencyProperty.Register(
"ItemHeight",
typeof (GridLength),
typeof (TreeViewItem),
new FrameworkPropertyMetadata(new GridLength(30)));
/// <summary>
/// Indique si un overlay est présent
/// </summary>
public GridLength ItemHeight
{
get
{
return (GridLength)GetValue(ItemHeightProperty);
}
set
{
SetValue(ItemHeightProperty, value);
}
}