各位老师好! 我做了一个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>
类的代码如下FileSelector.csusing System;
using System.Linq; //程序用到LINQ
using System.Windows; //TemplatePartAttribute
using System.Collections.Generic;
using System.Windows.Controls; //Control
using System.Windows.Input; //RoutedUICommand
using 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;
}
}
}
}
}工程编译完事之后,在toolbox能看到自定义控件的图标,但是当在其他的xaml文件中引用FileSelector的时候,不显示这个控件。主窗体的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>系统运行加载这个窗体,自定义控件FileSeletor不显示。这是问什么呢?
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>
类的代码如下FileSelector.csusing System;
using System.Linq; //程序用到LINQ
using System.Windows; //TemplatePartAttribute
using System.Collections.Generic;
using System.Windows.Controls; //Control
using System.Windows.Input; //RoutedUICommand
using 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;
}
}
}
}
}工程编译完事之后,在toolbox能看到自定义控件的图标,但是当在其他的xaml文件中引用FileSelector的时候,不显示这个控件。主窗体的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>系统运行加载这个窗体,自定义控件FileSeletor不显示。这是问什么呢?
解决方案 »
- 请教一个语法问题,怎么是this,如何使用的?
- 关于一个GUI的问题
- 如何在vs2005中编译并运行单个c#文件?
- 遇到一個難題!幫忙解決!
- 请教一个将DataTable表更新到Sql的问题
- ftp虚拟目录访问
- 本群(290836527)走精兵綫路!不再招新手。希望提高技術的1年以上.NET技術的朋友加入
- 窗体实例化问题,谢谢指教!
- C# 调用C++ 动态链接库 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- HttpWebRequest 获取网页源代码问题 高手进,不一般(RMB 50元求解)
- 长字符串,怎么只替换括号外部的逗号而不替换括号内部的逗号
- 如何将'2012-9-13' 转换成:'2012-09-13'中间加一个零呢?
把主窗体最外面的grid改成stackpanel就可以显示了
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"> <StackPanel 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> <StackPanel Name="inputArea" Margin="0,10,2,12" Background="Green">
</StackPanel>
<my1:FileSelector Name="fileSelector1" Height="177" />
</StackPanel>
</Window>还是出不来,是什么原因呢?
代码就不贴了 改了几个地方
app.xaml里面添加了资源字典
<Application.Resources>
<ResourceDictionary Source="./Themes/Generic.xaml"/>
</Application.Resources>给资源添加了key
<Style TargetType="{x:Type local:FileSelector}" x:Key="sssss">调用的时候加了key
<local:FileSelector Style="{StaticResource sssss}" x:Name="fileSelector1" Width="200" Height="300"/>你试试看看
工程的目录FileSelectorControl(工程名)
FileSelectorControl
Properties
References
Themes
Generic.xaml
FileSelector.cs
<local:FileSelector Style="{StaticResource sssss}" x:Name="fileSelector1" Width="200" Height="300"/>
给个style 这个style在哪里定义 随便你 只要能取到 不报错应该就ok了吧