/img/avatar.jpg

在ControlTemplate中使用VisualTreeHelper和LogicalTreeHelper

在TabControl中给TabItem定义如下的Template:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid x:Name="templateRoot" SnapsToDevicePixels="true">
	<Border x:Name="mainBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Background="{TemplateBinding Background}" Margin="0">
		<Border x:Name="innerBorder" BorderBrush="{StaticResource TabItem.Selected.Border}" BorderThickness="1,1,1,0" Background="{StaticResource TabItem.Selected.Background}" Margin="-1" Opacity="0"/>
	</Border>
	<DockPanel Margin="2,0">
	<Button Click="Button_Click" DockPanel.Dock="Right" Content="X" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="Blue"/>
	<ContentPresenter x:Name="contentPresenter" ContentSource="Header" Focusable="False" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"  RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
	</DockPanel>
</Grid>
</ControlTemplate>

实现的效果是给每一个TabItem添加关闭按钮:

InstallShield Limited Edition for Visual Studio 2013教程

【安装篇】

  1. 打开VS2013,文件-新建-项目-已安装-模板-其他项目类型-安装和部署-启用InstallShield Limited Edition。 /installshield2013/is1.png
  2. 根据提示操作,点击步骤2的“转到下载网站”。 /installshield2013/is2.png
  3. 填写相关信息后,点击Download下载InstallShield,同时注册邮箱会收到一封邮件,里面有序列号和下载链接。 /installshield2013/is3.png
  4. 退出VS,使用管理员权限重新打开VS,在文件-新建-项目-已安装-模板-其他项目类型-安装和部署中则可以看到InstallShield Limited Edition Project,点击确定,会弹出注册对话框,输入注册邮箱中收到的序列号即可完成注册。

PS:在win8.1下可能会遇到安装InstallShield后在VS中看不到"InstallShield Limited Edition Project",只有“启用InstallShield Limited Edition”的问题,在StackOverFlow中也有人遇到类似问题,我提出并整理这个问题后发现并不是win8.1不能安装InstallShield,从win8.1企业版更换到win8.1专业版后没有出现问题,由于没有继续在win8.1企业版下测试,所以只猜测是win8.1企业版下会出现该问题,或者是由于系统缺失文件,文件被篡改等原因,如果重新安装win8.1企业版仍不能解决,则尝试安装win8.1专业版。

C#调用C DLL参数问题

首先回顾一下API和C#参数类型的基本对应关系:

/csharp_call_c_dll/api1.png

需要注意的是这个对应关系是传入参数的对应关系,如果是输出参数,LPSTR和LPCSTR(也就是C/C++里面的char*),对应的就要是StringBuider。