回复:WPF 常见问题解答
怎么才能禁止内容撑大容器?这似乎很简单,只要设置容器为固定尺寸就可以了。但是假如我们为了自动化布局而不能设置容器尺寸呢?或者,假如我们在定义一个通用的样式,我们根本不知道目标容器的尺寸呢?
例如下面这段代码:
Code

Code
<WrapPanel>
<ListBox HorizontalContentAlignment="Stretch" Margin="8" Width="120" Height="220" BorderBrush="Blue" BorderThickness="3">
<ListBoxItem>1111111111</ListBoxItem>
<ListBoxItem>22222222222222222222</ListBoxItem>
<ListBoxItem>333333333333333333333333333333333333</ListBoxItem>
<ListBoxItem>44444444444444444444444444444444444444444</ListBoxItem>
</ListBox>
<ListBox HorizontalContentAlignment="Stretch" Margin="8" Width="180" Height="220" BorderBrush="Green" BorderThickness="3">
<ListBoxItem>1111111111</ListBoxItem>
<ListBoxItem>22222222222222222222</ListBoxItem>
<ListBoxItem>333333333333333333333333333333333333</ListBoxItem>
<ListBoxItem>44444444444444444444444444444444444444444</ListBoxItem>
</ListBox>
</WrapPanel>
有两个不同宽度的ListBox,我们设置其部分内容必定会超出其显示范围,现在的效果:

附件:
您所在的用户组无法下载或查看附件可以看到横向滚动条出现了。
我们定义一个模板来更直观的看一下显示效果:
Code

Code
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border>
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="OrangeRed"/>
<GradientStop Offset="1" Color="Brown"/>
</LinearGradientBrush>
</Border.Background>
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我们将ListBoxItem的内容绑定给一个TextBlock,然后为其外围的Border设置了横向渐变背景。
显示为:

附件:
您所在的用户组无法下载或查看附件现在可以看到,渐变背景的长度参差不齐。
即使你为TextBlock设置换行,也不会有任何效果,它们仍然会撑开Border。
分析:
子元素无法获知外围容器的尺寸,从而无法进行常规的控制,目前我只研究出一个偏方用于解决这一问题,就是在内容与外围容器之间加入一层Canvas。
这个例子中就是为Border外加上Canvas,并把Border的背景挪给Canvas,完整代码如下:
Code

Code
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Canvas Height="16">
<Canvas.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="OrangeRed"/>
<GradientStop Offset="1" Color="Brown"/>
</LinearGradientBrush>
</Canvas.Background>
<Border>
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<WrapPanel>
<ListBox
Width="120"
Height="220"
Margin="8"
BorderBrush="Blue"
BorderThickness="3"
HorizontalContentAlignment="Stretch">
<ListBoxItem>1111111111
</ListBoxItem>
<ListBoxItem>22222222222222222222
</ListBoxItem>
<ListBoxItem>333333333333333333333333333333333333
</ListBoxItem>
<ListBoxItem>44444444444444444444444444444444444444444
</ListBoxItem>
</ListBox>
<ListBox
Width="180"
Height="220"
Margin="8"
BorderBrush="Green"
BorderThickness="3"
HorizontalContentAlignment="Stretch">
<ListBoxItem>1111111111
</ListBoxItem>
<ListBoxItem>22222222222222222222
</ListBoxItem>
<ListBoxItem>333333333333333333333333333333333333
</ListBoxItem>
<ListBoxItem>44444444444444444444444444444444444444444
</ListBoxItem>
</ListBox>
</WrapPanel>
</Page>
显示效果:

附件:
您所在的用户组无法下载或查看附件可以看到,横向滚动条滚出去了,渐变背景也是整齐的了。
这个偏方并不完美,假如我们希望文字能够自动换行,或是在即将超出边框的地方显示省略号,都无法办到。
期待高手能提出更好的解决方案。
怎么弄出CheckListBox来?
附件:
您所在的用户组无法下载或查看附件见这篇文章:
http://www.cnblogs.com/SkyD/archive/2008/07/23/1249950.html如何在多选列表中实现右键菜单?就是这种效果:

附件:
您所在的用户组无法下载或查看附件这看起来很简单,但是当你做的时候可能会比较头疼。
你会发现,当你用鼠标右键在上面单击的时候,右键菜单正确弹出,但是同时你鼠标所处位置的列表项的选取状态也被改变了,这时如果用户没有注意到,就可能会产生很严重的误操作,比如将本不该删除的项目删除了。
分析:
WPF中,鼠标右键也可进行选取列表项的操作,为了禁用这一功能,我们必须在ListBox中拦截下这个事件,让ListBoxItem无法获知此事件的发生。
这是由noorbakhsh提供的方法:
在ListBox中加入事件处理:PreviewMouseRightButt
拦截事件:
Code

Code
private void listBox1_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
这样就成功的屏蔽了右键选取功能。