Silverlight 2 RTW中ToolTipService.ToolTip不继承父节点的DataContext的问题
2009-04-12 22:11
232 查看
在Silverlight2 RTW中,利用ToolTipService.ToolTip可以实现ToolTip(提示)效果,例如:
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="这是提示信息
![](http://images.cnblogs.com/dot.gif)
" />
显示如图:
![](http://pic002.cnblogs.com/img/qguohog/200904/2009041221400975.png)
我们还可以自定义提示信息的显示样式,例如改变字体或者显示复杂的图形,等等。例如:
<Button Width="100" Height="40" Content="Button">
<ToolTipService.ToolTip>
<Grid>
<Ellipse Width="150" Height="50" Fill="Beige"></Ellipse>
<TextBlock Text="这是提示信息
![](http://images.cnblogs.com/dot.gif)
" Foreground="Red" />
</Grid>
</ToolTipService.ToolTip>
</Button>
显示如图:
![](http://pic002.cnblogs.com/img/qguohog/200904/2009041221452013.png)
对于提示信息,同样可以使用Binding(特别是在ControlTemplate里常常使用Binding,例如ListBoxItem)。例如:
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="{Binding UserName}" />
</Grid>
但下面的这种绑定方式确不能正常显示提示信息:
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button">
<ToolTipService.ToolTip>
<TextBlock x:Name="txt" Text="{Binding UserName}" />
</ToolTipService.ToolTip>
</Button>
</Grid>
这是因为在Silverlight 2RTW里,ToolTipService.ToolTip没有继承上层元素的DataContext。如果我们显示指定ToolTipService.ToolTip的DataContext,这种方式同样可以工作。但显示指定ToolTip的DataContext在有的场合是有点别扭,特别是在ControlTemplate里更是有一定的困难。
为了使ToolTip能够利用父级的DataContext进行绑定,在http://silverlight.net/forums/p/14241/46745.aspx#46745讨论了在Beta 1下修改ToolTip原代码的方法。目前我还没有找到Silverlight 2 RTW下对应的Controls完整示例代码,为此,我们可以用一个变通的方式来绕过这个问题。既然直接在ToolTipService.ToolTip="{Binding UserName}" 里能够成功绑定,为了实现复杂的提示信息,我们可以借助Converter来实现:
<UserControl.Resources>
<local:Converter x:Name="myConverter" />
</UserControl.Resources>
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="{Binding UserName,Converter={StaticResource myConverter}}" />
</Grid>
关键的部分我们在Converter里实现:
public class Converter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
var s = value.ToString();
TextBlock block = new TextBlock();
block.Text = s;
block.Style = (Style)Application.Current.Resources["MyTextBlockStyle"];
return block;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
可以参考这个帖子:http://silverlight.net/forums/p/84675/197144.aspx#197144
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="这是提示信息
![](http://images.cnblogs.com/dot.gif)
" />
显示如图:
![](http://pic002.cnblogs.com/img/qguohog/200904/2009041221400975.png)
我们还可以自定义提示信息的显示样式,例如改变字体或者显示复杂的图形,等等。例如:
<Button Width="100" Height="40" Content="Button">
<ToolTipService.ToolTip>
<Grid>
<Ellipse Width="150" Height="50" Fill="Beige"></Ellipse>
<TextBlock Text="这是提示信息
![](http://images.cnblogs.com/dot.gif)
" Foreground="Red" />
</Grid>
</ToolTipService.ToolTip>
</Button>
显示如图:
![](http://pic002.cnblogs.com/img/qguohog/200904/2009041221452013.png)
对于提示信息,同样可以使用Binding(特别是在ControlTemplate里常常使用Binding,例如ListBoxItem)。例如:
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="{Binding UserName}" />
</Grid>
但下面的这种绑定方式确不能正常显示提示信息:
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button">
<ToolTipService.ToolTip>
<TextBlock x:Name="txt" Text="{Binding UserName}" />
</ToolTipService.ToolTip>
</Button>
</Grid>
这是因为在Silverlight 2RTW里,ToolTipService.ToolTip没有继承上层元素的DataContext。如果我们显示指定ToolTipService.ToolTip的DataContext,这种方式同样可以工作。但显示指定ToolTip的DataContext在有的场合是有点别扭,特别是在ControlTemplate里更是有一定的困难。
为了使ToolTip能够利用父级的DataContext进行绑定,在http://silverlight.net/forums/p/14241/46745.aspx#46745讨论了在Beta 1下修改ToolTip原代码的方法。目前我还没有找到Silverlight 2 RTW下对应的Controls完整示例代码,为此,我们可以用一个变通的方式来绕过这个问题。既然直接在ToolTipService.ToolTip="{Binding UserName}" 里能够成功绑定,为了实现复杂的提示信息,我们可以借助Converter来实现:
<UserControl.Resources>
<local:Converter x:Name="myConverter" />
</UserControl.Resources>
<Grid DataContext="{StaticResource MyUser}">
<Button Width="100" Height="40" Content="Button" ToolTipService.ToolTip="{Binding UserName,Converter={StaticResource myConverter}}" />
</Grid>
关键的部分我们在Converter里实现:
public class Converter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
var s = value.ToString();
TextBlock block = new TextBlock();
block.Text = s;
block.Style = (Style)Application.Current.Resources["MyTextBlockStyle"];
return block;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
可以参考这个帖子:http://silverlight.net/forums/p/84675/197144.aspx#197144
相关文章推荐
- Silverlight 2 RTW中ToolTipService.ToolTip不继承父节点的DataContext的问题
- Hadoop集群启动之后,datanode节点未正常启动的问题
- silverlight datacontext
- 关于hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
- hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
- hadoop 节点链接不通、datanode无法启动问题解决
- 关于hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
- 深度探索c++对象模型读书笔记:Data语意学-继承与Data member中内存对齐问题
- silverlight 开发之System.Data.Silverlight的问题
- Msdn keypoint in silverlight part 1(DataContext)
- LINQ DataContext IsReadOnly 问题
- hadoop启动start-all.sh,slave节点没有datanode的问题
- Hadoop datanode正常启动,但是Live nodes中却缺少节点的问题
- 关于hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
- asp.net mvc 2 简简单单做开发 使用DataContext扩展方法Find<TEntity>(TEntity obj) 遇到的问题
- LINQ to SQL: DataContext.SubmitChanges() 失效问题
- Silverlight 自定义控件的继承问题2
- Silverlight.解决DataTemplate中绑定的Command无法触发的问题
- Silverlight 如何实现DataContextChanged
- silverlight学习笔记。Style的继承(BaseOn)默认样式的问题