4

我遇到了异常:

“{0}”不是 Visual 或 Visual3D。

我发现类似的唯一问题:WPF: System.ArgumentException => {"'{0}' is not a Visual or Visual3D."}

我只是在构建“漂亮”的网格。无需处理双击。当用户错误地双击时,这只是副作用 - 抛出此异常。

XAML 看起来像这样:

<DataGrid
  ItemsSource="{Binding Source={StaticResource TrucksSource}}"
  CanUserReorderColumns="False" 
  CanUserResizeColumns="True" 
  CanUserResizeRows="False" 
  AutoGenerateColumns="False" 
  BorderThickness="0" 
  CanUserAddRows="False" 
  RowBackground="{StaticResource GrayBackgroundGradientBrush}"
  RowHeight="20" Focusable="False" RowHeaderWidth="0">
  <DataGrid.Columns>
      <DataGridTemplateColumn Header="Select" Width="40" CanUserSort="True" SortMemberPath="IsSelected">
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <CheckBox
                      IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center" />
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
      <DataGridTemplateColumn Header="Team" Width="42" CanUserSort="True" SortMemberPath="TeamDispatcherCaptionShort">
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <Border
                  Margin="-2,-1">
                      <TextBlock ToolTip="{Binding TeamDispatcherCaptionLong}" 
                      Foreground="#414141" FontFamily="Arial" FontSize="12"
                      Text="{Binding TeamDispatcherCaptionShort}" 
                      HorizontalAlignment="Center" VerticalAlignment="Center" />
                  </Border>
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>

每当用户双击时,我都会遇到异常。第一列是复选框。当它被单击时,它工作正常。当我单击复选框周围的任何区域时 - 异常。

我如何解决它?后面没有代码,是MVVM项目

编辑:

好的,我继续尝试在小项目上重现这个。我已经想到了问题,但想知道你对此的看法。我需要奖励这个赏金:)

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <CollectionViewSource x:Key="WidgetsSource" Source="{Binding Widgets}" />
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <DataGrid
            ItemsSource="{Binding Source={StaticResource WidgetsSource}}"
            CanUserReorderColumns="False" 
            CanUserResizeColumns="True" 
            CanUserResizeRows="False" 
            AutoGenerateColumns="False" 
            BorderThickness="0" 
            CanUserAddRows="False" 
            VerticalGridLinesBrush="#00000000" 
            HorizontalGridLinesBrush="Gray" 
            RowBackground="LightGray"
            RowHeight="20" Focusable="False" RowHeaderWidth="0" SelectionUnit="Cell">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Prop1" Width="50" CanUserSort="True" SortMemberPath="Prop1">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border>
                                <TextBlock>
                                    <Run Text="{Binding NestWidg.Prop1}" />
                                </TextBlock>
                            </Border>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Prop2" Width="50" CanUserSort="True" SortMemberPath="Prop1">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border>
                                <TextBlock Text="{Binding Prop1}" />
                            </Border>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>                
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

虚拟机:

namespace WpfApplication1
{
    using System.Collections.ObjectModel;

    public class MainWindowVM
    {
        public ObservableCollection<Widget> Widgets { get; set; }

        public MainWindowVM()
        {
            this.Widgets = new ObservableCollection<Widget>();

            this.Widgets.Clear();
            this.Widgets.Add(new Widget("a", "b") { NestWidg = new NestWidget { Prop1 = "Nest" } });
        }
    }

    public class Widget
    {
        public Widget(string p1, string p2)
        {
            Prop1 = p1;
            Prop2 = p2;
        }

        public string Prop1 { get; private set; }

        public string Prop2 { get; private set; }

        public NestWidget NestWidg { get; set; }
    }

    public class NestWidget
    {
        public string Prop1 { get; set; }
    }
}

后面的代码:

namespace WpfApplication1
{
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
            this.DataContext = new MainWindowVM();
        }
    }
}
4

4 回答 4

4

是的。您的示例项目现在抛出错误。那是因为你已经绑定了 Run。在您的第一篇文章中,您错过了它,所以这就是我无法复制它的原因。

看起来它确实是一个很老的错误,许多用户都有过。知道微软,它不会很快被修复。(我猜这个错误从一开始就是 WPF 的一部分)。你最好的选择是聪明。

仅绑定视觉对象。< 运行 > 不是可视的。

您必须制作自定义 TextBlock,它会在不使用绑定的情况下基于 DataContext 生成正确的运行。您需要声明新的依赖属性,该属性将成为 TextBlock 的一部分并将自己挂接到 UIPropertyChanged 方法中,在那里您将生成 Runs()。

于 2012-09-13T16:17:53.010 回答
0

我无法重现该错误。我已经复制了你的代码,里面充满了数据,但是我可以在任何地方双击。你在运行 .NET4.0 吗?

附上你的整个程序/给我产生错误的示例代码。(包括数据等)

您应该将其缩小到产生此内容的确切绑定/UI 元素。CheckBox 是否对此错误负责?如果删除第二列会发生什么?如果将 CheckBox 包裹在 Border 中并设置 background=Transparent 会怎样。如果您对第二列执行此操作怎么办?

也许您可以将 MouseLeftButtonDown 事件侦听器附加到某个地方,您可以使用 e.ClickCount==2 查看鼠标单击是否表明它是双击的一部分。然后你就可以处理它了,e.Handled=true。

于 2012-09-13T07:13:00.617 回答
0

DataBinding 是否由后台线程更新?如果是这样,那就是错误来源。我曾经遇到过这样的崩溃并在这里解决了。

于 2012-09-13T07:42:29.997 回答
0

这是一个很难弄清楚的问题。我应该立即搜索谷歌,因为我可能会更早找到这些信息。

对于那些追随我的人,我有一些东西要补充:

我喜欢 a 的格式化功能TextBlock,但我(最终)发现TextBlock在 the中使用 aCellTemplate是导致

“{0}”不是 Visual 或 Visual3D。

错误。

自定义 时DataGridTemplateColumn,您可以选择指定 a HeaderTemplate、 aCellTemplate和 a CellEditingTemplate

TextBlock我在 的HeaderTemplate和 中CellEditingTemplate使用a 没有任何困难DataGrid

CellTemplate如果网格允许编辑以响应单击,这只是一个问题。如果您只是显示数据而不允许编辑,那么TextAreaCellTemplate.

于 2017-10-31T20:44:04.813 回答