CanYou1 发表于 2015-12-2 11:32:00

System.ArgumentException: “-17”不是属性“ViewportSize”的有效值。

Alice,请看下下面这个异常,它直接导致我们程序漰溃,连友好提示都没了。
我不知从何入手,是FlexGrid里的,我也不知属性“ViewportSize”是什么用?我并没有设置它

异常时间:2015-12-02 11:02:23,226
异常级别:ERROR
异 常 类:logerror [(null)]
出现全局未捕获异常
System.ArgumentException: “-17”不是属性“ViewportSize”的有效值。
   在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   在 System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   在 C1.WPF.FlexGrid.C1FlexGrid.UpdateScrollBars()
   在 C1.WPF.FlexGrid.C1FlexGrid.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
   在 System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 C1.WPF.C1LinePanel.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.ScrollContentPresenter.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds)
   在 System.Windows.Controls.ScrollViewer.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
   在 System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Documents.AdornerDecorator.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.Border.ArrangeOverride(Size finalSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Controls.DockPanel.ArrangeOverride(Size arrangeSize)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.Window.ArrangeOverride(Size arrangeBounds)
   在 System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
   在 System.Windows.UIElement.Arrange(Rect finalRect)
   在 System.Windows.ContextLayoutManager.UpdateLayout()
   在 System.Windows.UIElement.UpdateLayout()
   在 System.Windows.Interop.HwndSource.SetLayoutSize()
   在 System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
   在 System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
   在 System.Windows.Window.SetRootVisual()
   在 System.Windows.Window.SetRootVisualAndUpdateSTC()
   在 System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
   在 System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   在 System.Windows.Window.CreateSourceWindowDuringShow()
   在 System.Windows.Window.SafeCreateWindowDuringShow()
   在 System.Windows.Window.ShowHelper(Object booleanBox)
   在 System.Windows.Window.Show()
   在 System.Windows.Window.ShowDialog()

Alice 发表于 2015-12-2 15:16:00

回复 1楼CanYou1的帖子

感谢您的反馈。
ScrollBar的ViewportSize属性:设置滚动条上白条的长度值,应该等于C1FlexGrid的宽度值,即可视范围的长度或宽度值。
您可以检查下是否操作这个属性。
如果不是这个问题,建议您提供可以重现问题的Demo,我们帮您看看。

CanYou1 发表于 2015-12-3 00:37:00

回复 2楼Alice的帖子

今天跟你挂完电话后就开始做Demo,从项目里面抠出Demo并不容易,搞了一天,终于把Demo做出来了,如下:



您需要用Nuget先还原下dll包,跑起来后,当去掉最后一个勾的时候,整个程序漰溃,如下:




Alice 发表于 2015-12-3 10:21:00

回复 3楼CanYou1的帖子

谢谢您的Demo和提示。
通过您的Demo演示,我们通过如下代码重现您的问题:
    <Grid>
      <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>         
      </Grid.RowDefinitions>
      <Border Grid.Row="1" IsEnabled="False">
            <c1:C1FlexGrid />
      </Border>
    </Grid>
是grid分行,然后还需要设置border的IsEnabled为False才能必然重现。

您的这个问题我会提交到产品组确认是否是Bug?如果有进一步反馈会在第一时间通知您。
很抱歉给您带来的不便。

CanYou1 发表于 2015-12-3 10:38:00

回复 4楼Alice的帖子

好的,尽快回复我,谢了。

Alice 发表于 2015-12-3 11:43:00

回复 3楼CanYou1的帖子

您好。
根据您的示例来看,问题是由于您设置了IsEnabled=false导致的。
这个时候flexgrid会设法计算viewport,但您在代码里更改了原数据,导致又要重新计算viewport,才出现了异常?

想请问您是有什么特殊需求,需要设置IsEnabled=false?

CanYou1 发表于 2015-12-3 14:15:00

回复 6楼Alice的帖子

Border里加IsEnabled=false还是有必要的,我们是为了在某种情况下统一将其下的所有孩子禁用时用的,问题是我设置Boarder禁用,跟FlexGrid的viewport有什么关系呢?而且我改变数据源ItemsSource你们的flexgrid也是支持的,就只有当数据源ItemsSource个数为0时才报这个错,而且错得还很严重,导致我们的主程序直接漰掉了,我想这应该是C1Flexgrid的bug吧?

Alice 发表于 2015-12-3 19:48:00

回复 7楼CanYou1的帖子

Border里只可能加一个子,也就是说您只需要设置一个IsEnabled=false?
通过Border设置后,您还需要设置C1FlexGrid的IsEnabled么?
如果不需要FlexGrid是Enabled的,那也就是说scrollbar也是没有意义的了。所以,可以重写FlexGrid的模板,删除掉template中的Scrollbar元素。

如果这种建议能够满足您的需求,我可以给您提供一个重写的demo。

CanYou1 发表于 2015-12-3 21:45:00

回复 8楼Alice的帖子

Border下面孩子以及孩子的孩子,可以有很多的。这样,麻烦您先按您说的,重写下FlexGrid的模板吧。谢了。

Alice 发表于 2015-12-4 15:11:00

回复 9楼CanYou1的帖子

重写FlexGrid的模板,删除掉template中的Scrollbar元素。请参考附件。

页: [1] 2
查看完整版本: System.ArgumentException: “-17”不是属性“ViewportSize”的有效值。