2016-08-09 65 views
0

Ich baue ein CustomControl mit einigen DependencyProperty. Es ist ein einfaches Steuerelement, um nach einem Pfad zu suchen, und enthält eine Beschriftung, ein Textfeld und eine Schaltfläche.Der DependencyProperty-Typ von GridLength übergibt den Wert "Auto" nicht an ChildElement in CustomControl

Ich möchte die Breite des Etiketts, des Textfelds und der Schaltfläche getrennt festlegen. Also habe ich einige DependencyProperty für sie hinzugefügt.

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

Und hier sind der XML-Code meiner Custom:

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

alle Bindungen mit den DependencyProperty vom Typ String arbeiten perfekt, aber die Aufenthalte der Width-Eigenschaft mit dem Wert „auto“. Ich getestet mit einem Konverter, und ein Wert von "200" auf DP gesetzt "LabelWidth" kam als {200} (wenn ich Maus über 'Wert' wenn Breakpoint im Konverter getroffen), aber die Breite der Beschriftung nicht Veränderung. Wenn ich GridLength-Double ändern kann ich es nicht zu Auto

Antwort

1

Ich fand endlich die Antwort.

Ich musste das Attribut [TypeConverterAttribute(typeof(LengthConverter))] vor der Eigenschaft Width hinzufügen.

[TypeConverterAttribute(typeof(LengthConverter))] 
public Double LabelWidth 
{ 
    get { return (Double)GetValue(labelWidth); } 
    set { SetValue(labelWidth, value); } 
} 

Dann änderte ich die DependencyProperty zu:

public static DependencyProperty labelWidth = DependencyProperty.Register("LabelWidth", typeof(Double), typeof(PathBrowser), 
    new FrameworkPropertyMetadata(Double.NaN, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

als ich die labelwidth zu Auto einstellen:

<local:PathBrower LabelWidth="Auto" /> 
1

Die Art der Width Eigenschaft der Label Klasse double ist. Ihre LabelWidth sollte also vom Typ double und nicht GridLength sein.

+0

Und Wie kann ich die Breite auf "Auto"? –

+0

Danke für das Hinzeigen. Irgendwann wusste ich es, aber Ihre Antwort wies mich an, tiefer in die MSDN-Dokumentation über die Eigenschaft 'Width' von' FrameworkElement' zu gehen, und dort fand ich den Verstärker. –