wpf custom control 不显示
各位老师好!
我做了一个wpf的自定义控件(custom control)。
Generic.xaml文件代码如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:FileSelectorControl"> <Style TargetType="{x:Type local:FileSelector}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:FileSelector}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ScrollViewer Name="scrolls" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <ScrollViewer.Content> <StackPanel Name= "multi_item" Orientation="Vertical" ScrollViewer.VerticalScrollBarVisibility="Auto"> <StackPanel Orientation="Horizontal" Height="30" Margin="0,5,0,0"> <Button Name="add_item" Content="增加" Margin="5,0,0,0" Width="80" ></Button> <Button Name="del_item" Content="删除" Margin="5,0,0,0" Width="80" /> </StackPanel> <StackPanel Name="stack_static" Orientation="Horizontal" Height="30" Margin="0,5,0,0"> <TextBox Name="textBox_FileFullName" Margin="5,0,5,0" Width="330"></TextBox> <Label Content="名称" Margin="5,0,5,0"></Label> <TextBox Name="displayName" Margin="5,0,5,0" Width="200"></TextBox> <Button Name="button_browser" Content="浏览"/> </StackPanel> <StackPanel Name="dynamic_item"> </StackPanel> </StackPanel> </ScrollViewer.Content> </ScrollViewer> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style></ResourceDictionary>
using System;using System.Linq; //程序用到LINQ using System.Windows; //TemplatePartAttributeusing System.Collections.Generic;using System.Windows.Controls; //Controlusing System.Windows.Input; //RoutedUICommandusing Microsoft.Win32; //对话框OpenFileDialognamespace FileSelectorControl{ [TemplatePart(Name = "textBox_FileFullName", Type = typeof(TextBox))] public class FileSelector : Control { static FileSelector() { DefaultStyleKeyProperty.OverrideMetadata(typeof(FileSelector), new FrameworkPropertyMetadata(typeof(FileSelector))); } public FileSelector():base() { } #region 控件模板 Button add_item; Button del_item; Button btn1; StackPanel multi_item; StackPanel dynamic_item; TextBox tbx ; public override void OnApplyTemplate() { base.OnApplyTemplate(); add_item = Template.FindName("add_item", this) as Button; del_item = Template.FindName("del_item", this) as Button; add_item.Click += new RoutedEventHandler(add_item_click); del_item.Click += new RoutedEventHandler(del_item_click); btn1 = Template.FindName("button_browser",this) as Button; btn1.Click += new RoutedEventHandler(btn_click); multi_item = Template.FindName("stackPanel_multiItem", this) as StackPanel; dynamic_item = Template.FindName("stackPanel_dynamicItem", this) as StackPanel; tbx = Template.FindName("textBox_FileFullName", this) as TextBox; } #endregion #region 对话框处理 public string PredefinedExts { get; set; } string GetFilterString(out string first) { first = null; var exts = PredefinedExts.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); string head = string.Empty; if (exts.Length != 0) { var trim = exts.Where(s => s.Trim() != String.Empty); first = trim.FirstOrDefault(); head = String.Join("|", trim.Select(s => String.Format("{0}文件|*.{1}", s.ToUpper(), s.ToLower()))); } if (head != String.Empty) head += "|"; return head + "所有文件|*.*"; } string OpenDialog() { var dlg = new OpenFileDialog(); string defExt; dlg.Filter = GetFilterString(out defExt); dlg.DefaultExt = defExt; if (dlg.ShowDialog() == true) return dlg.FileName; return null; } #endregion void add_item_click(object sender, RoutedEventArgs e) { StackPanel panel = new StackPanel(); panel.Orientation = Orientation.Horizontal; panel.Margin = new Thickness(0, 5, 0, 0); TextBox tbx = new TextBox(); tbx.Width = 330; tbx.Height = 30; tbx.Margin = new Thickness(5, 0, 5, 0); Button btn = new Button(); btn.Content = "浏览"; btn.Click += new RoutedEventHandler(btn_click); panel.Children.Add(tbx); panel.Children.Add(btn); //multi_item.Children.Remove(); dynamic_item.Children.Add(panel); } void del_item_click(object sender, RoutedEventArgs e) { int count = dynamic_item.Children.Count; if(count>0){ dynamic_item.Children.RemoveAt(count-1); } } void btn_click(object sender,RoutedEventArgs e) { string path = OpenDialog(); Button btn = sender as Button; StackPanel parent = btn.Parent as StackPanel; foreach(var child in parent.Children){ if(child is TextBox){ ((TextBox)child).Text = path; } } } }}
主窗体的xaml文件如下<Window x:Class="metadataTool.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:DevComponents.WpfEditors;assembly=DevComponents.WpfEditors" Background="Chocolate" Title="元数据录入系统" Height="706" Width="1095" xmlns:my1="clr-namespace:FileSelectorControl;assembly=FileSelectorControl" xmlns:my2="clr-namespace:FileSelectorControl.Themes;assembly=FileSelectorControl"> <Grid Width="1009" Height="675"> <Menu Height="25" HorizontalAlignment="Left" Name="menu" VerticalAlignment="Top" Width="881" Margin="4,4,0,0"> <MenuItem Header="文件" Name="file" Margin="20,0,20,0"> <MenuItem Header="退出" Name="exit"></MenuItem> </MenuItem> <MenuItem Header="操作" Name="view" Margin="0,0,20,0"></MenuItem> <MenuItem Header="帮助" Name="help" Margin="0,0,20,0"></MenuItem> </Menu> <my1:FileSelector Name="fileSelector1" Width="200" Height="300"/> <StackPanel Name="inputArea" Margin="0,30,2,12" Background="Green"> </StackPanel> </Grid> </Window>