WPF中无法访问Image控件Tooltip内的子Image控件问题
WPF无法访问Tooltip内控件的解决方案
问题原因
Tooltip属于独立的可视化树,且你把lastImage放在了ToolTip的ControlTemplate内部,WPF不会将模板内的控件自动注册到UserControl的后台代码命名空间中,因此直接通过控件名称访问会报错。
解决方案
1. 数据绑定(推荐,符合WPF设计思想)
这种方式无需直接操作控件,通过数据驱动UI更新:
- 在UserControl的后台代码或ViewModel中定义一个实现
INotifyPropertyChanged的属性:
private ImageSource _currentImage; public ImageSource CurrentImage { get => _currentImage; set { _currentImage = value; OnPropertyChanged(nameof(CurrentImage)); } } // 实现INotifyPropertyChanged接口的方法 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
- 修改XAML中两个Image的Source绑定到该属性:
<!-- 缩略图 --> <Image Name="lastImageThumbnail" Source="{Binding CurrentImage}" Height="30" Width="30" ToolTipService.ShowOnDisabled="True"> <Image.ToolTip> <ToolTip Placement="Bottom"> <ToolTip.Template> <ControlTemplate> <StackPanel> <Path Margin="5,0,0,0" Fill="DarkGray" Data="M 0 16 L 16 0 L 32 16 Z"/> <!-- 大图绑定同一个属性 --> <Image Name="lastImage" Height="400" Width="400" Source="{Binding CurrentImage}"/> </StackPanel> </ControlTemplate> </ToolTip.Template> </ToolTip> </Image.ToolTip> </Image>
- 设置UserControl的DataContext(如果用后台代码作为数据源):
public GetFrame() { InitializeComponent(); DataContext = this; }
- 更新图片时只需修改属性:
if (File.Exists(fullpath)) { var image = new BitmapImage(new Uri(fullpath)); getframe.CurrentImage = image; }
2. 通过模板查找控件
如果不想用绑定,可以在UserControl中添加方法查找Tooltip内的Image:
public Image GetTooltipImage() { var tooltip = lastImageThumbnail.ToolTip as ToolTip; if (tooltip == null) return null; // 强制加载模板 tooltip.ApplyTemplate(); return tooltip.Template.FindName("lastImage", tooltip) as Image; }
- 调用更新:
if (File.Exists(fullpath)) { var image = new BitmapImage(new Uri(fullpath)); getframe.lastImageThumbnail.Source = image; var tooltipImage = getframe.GetTooltipImage(); tooltipImage?.Source = image; }
内容的提问来源于stack exchange,提问作者SimonJohnson
相关产品推荐
相关产品推荐

