小编WPF*_*bie的帖子

C#如何实现Dispose方法

我需要一些关于该Dispose方法实现的建议.

在我们的应用程序中,用户设计自己的UI.我有一个预览窗口,显示UI的外观.此UI中绘制的所有对象最终都来自公共基类ScreenObject.我的预览管理器包含对ScreenGrid的单个对象引用,ScreenGrid是整个预览区域的网格对象.

问题#1

我的一些派生屏幕类保留了非托管资源,例如数据库连接,位图图像和WebBrowser控件.这些类需要处理这些对象.我在基类中创建了一个虚Dispose方法,ScreenObject然后Dispose在每个派生类中实现了一个覆盖非托管资源的覆盖方法.但是,现在我刚刚创建了一个名为的方法Dispose,我没有实现IDisposable.我应该实施IDisposable吗?如果是这样,我该如何实现它?

  • 只是在具有非托管资源的派生类上
  • 基类和具有非托管资源派生类OR
  • 基类和所有派生类,包括那些没有非托管资源的类

将虚Dispose方法放在没有非托管资源的基类中是否错误,以便您可以利用多态?

问题2

在阅读有关Dispose方法和IDisposable接口的过程中,Microsoft声明处置对象应该只调用Dispose其父对象的方法.父母将为其父母调用它,依此类推.对我而言,这似乎是倒退.我可能想要处理一个孩子但保留其父母.

我认为它应该是另一种方式,处置的对象应该处理它的孩子.然后孩子们应该处理他们的孩子等等.

我错在这里还是我错过了什么?

c# dispose

31
推荐指数
2
解决办法
6万
查看次数

DataGrid行虚拟化显示问题

我们目前有一个DataGrid必然的DataTable.它还有一个模板列,CheckBox其中包含我们以编程方式添加的内容.此列的目的是跟踪多个选择DataGrid.

工厂用于CheckBox为每行创建es.

有相当多的记录,因此行虚拟化设置为true,以便性能可以接受.然而,我们看到一个奇怪的问题,如果我们CheckBox在前10行检查一些es然后向下滚动大约50行(网格在任何时候都有大约10行可见),那么会出现一堆其他的CheckBoxes随机检查.

如果我们禁用行虚拟化,则此问题不存在(但性能很糟糕).有没有办法解决?谁知道我们可能做错了什么?

wpf virtualization datagrid row

26
推荐指数
1
解决办法
2万
查看次数

如何取消ComboBox SelectionChanged事件?

是否有一种简单的方法来提示用户确认组合框选择更改,如果用户选择"否",则不处理更改?

我们有一个组合框,更改选择将导致数据丢失.基本上用户选择一种类型,然后他们就能输入该类型的属性.如果他们更改了类型,我们会清除所有属性,因为它们可能不再适用.问题是,在选择之下,您SelectionChanged再次提出事件.

这是一个片段:

if (e.RemovedItems.Count > 0)
{
    result = MessageBox.Show("Do you wish to continue?", 
        "Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning);

    if (result == MessageBoxResult.No)
    {
        if (e.RemovedItems.Count > 0)
            ((ComboBox)sender).SelectedItem = e.RemovedItems[0];
        else
            ((ComboBox)sender).SelectedItem = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个解决方案,我都不喜欢.

  1. 用户选择"否"后,删除SelectionChanged事件处理程序,更改所选项目,然后SelectionChanged再次注册事件处理程序.这意味着您必须在类中保留事件处理程序的引用,以便您可以添加和删除它.

  2. 创建一个ProcessSelectionChanged布尔值作为类的一部分.始终在事件处理程序的开头检查它.在我们更改选择之前将其设置为false,然后将其重置为true.这将工作,但我不喜欢使用标志基本上使事件处理程序无效.

任何人都有替代解决方案或改进我提到的?

c# wpf combobox selectionchanged

20
推荐指数
3
解决办法
4万
查看次数

使用应用程序分发.NET 4.0可再发行组件

我想用我们的应用程序打包.NET 4.0可再发行组件.我们将安装到可能没有外部网络或Internet访问的系统上.

我去了Microsoft站点下载这个,可再发行组件包的大小为48MB.我一直以为它接近1GB的大小.我看错了什么?

这是我使用的链接.

http://www.microsoft.com/download/en/details.aspx?id=17718

我需要能够在任何合格的Windows平台上安装的东西,让它在没有任何Internet访问的情况下执行.NET 4.0框架的完整安装.

.net redistributable

9
推荐指数
1
解决办法
6369
查看次数

我想要一个替代单身的设计

我意识到有很多关于单身人士的讨论以及为什么那些不好.这不是这个问题的意思.我理解单身人士的弊端.

我有一个场景,使用单例很容易,看起来很有意义.但是,我想要一种能够在没有大量开销的情况下完成我需要的替代方案.

我们的应用程序设计为客户端,通常在现场的笔记本电脑上运行,并与后端服务器通信.我们在主应用程序的底部有一个状态栏.它包含一些显示各种雕像和信息的文本区域以及几个图标.图标会更改其图像以指示其状态.例如指示其是否连接的GPS图标以及错误状态.

我们的主要类叫做MobileMain.它拥有状态栏区域并负责创建它.然后我们有一个StatusBarManager类.StatusBarManager当前是一个静态类,但也可以是一个单例.这是课程的开始.

public static class StatusBarManager
{
    static ScreenStatusBar StatusBar;

    /// <summary>
    /// Creates the status bar that it manages and returns it.
    /// </summary>
    public static ScreenStatusBar CreateStatusBar()
    {
        StatusBar = new ScreenStatusBar();
        return StatusBar;
    }
Run Code Online (Sandbox Code Playgroud)

MobileMain向StatusBarManager请求StatusBar.然后它使用StatusBar.没有其他类可以看到StatusBar,只有StatusBarManager.

状态栏的更新可以来自应用程序中的任何位置.大约有20个类可以更新状态栏上的文本区域以及更新图标状态的其他类.

每个只有一个StatusBar和一个StatusBarManager.

有什么建议可以更好地实施吗?

我有些想法:

使StatusBarManager成为实例类.在我的MobileMain类中,保留StatusBarManager类的静态公共实例.然后,要进行状态栏更新,您可以调用MobileMain.StatusBarManager.SetInformationText或管理器的其他方法.StatusBarManager不是单例,但MobileMain只会创建它的静态实例.这里的问题是MobileMain现在有一个StatusBar和一个StatusBarManager,它只管理它拥有的StatusBar.还有一个全局avaialble静态实例到StatusBarManager,只是一个不同的所有者.

另一个想法是使用类似EventEggregator类的东西.我从未使用过一个,但已经读过它们.我想这个概念是它将是一个全球可用的类.在每个想要更新状态栏的类中,它将发布StatusBarUpdate事件.StatusBarManager将是唯一订阅StatusBarUpdate事件的类,并接收所有通知.我读过,如果您在清理对象时不小心清除事件,那么这种方法最终可能会泄漏.这种方法值得研究吗?

c# wpf singleton

9
推荐指数
1
解决办法
2292
查看次数

将WPF样式触发器绑定到自定义依赖项属性

我在这里发现了许多类似的线程,但没有一个似乎解决了我的具体问题.

我需要在某些条件下突出显示文本框的背景.我创建了一个Highlight属性,并尝试在样式中使用触发器来设置它,但它实际上并不突出显示文本.

这是我的风格,简化:

<Style x:Key="TextBoxStyle" BasedOn="{StaticResource CommonStyles}">
    <Style.Triggers>
        <Trigger Property="Elements:DataElement.Highlight" Value="True">
            <Setter Property="Control.Background"
                    Value="{DynamicResource EntryBoxHighlightBackground}"/>
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

元素定义为:

xmlns:Elements="clr-namespace:MDTCommon.Controls.Forms.Elements">
Run Code Online (Sandbox Code Playgroud)

然后我有应用样式的部分:

<!-- Applies above style to all TextBoxes -->
<Style TargetType="TextBox" BasedOn="{StaticResource TextBoxContentHolder}" >
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
    <!-- Overrides the default Error Style -->
</Style>
Run Code Online (Sandbox Code Playgroud)

在DataElement类的后面代码如下:

public static readonly DependencyProperty HighlightProperty = 
    DependencyProperty.Register("Highlight", typeof(bool), typeof(DataElement));

public bool Highlight
{
    get { return (bool)base.GetValue(HighlightProperty); }
    set { base.SetValue(HighlightProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)

DataElement最终派生自UserControl,它包含对TextBox对象以及其他对象的引用.

在容纳所有DataElement对象的CustomForm类中,我有以下内容来设置颜色.

Resources["EntryBoxHighlightBackground"] = Brushes.Yellow;
Run Code Online (Sandbox Code Playgroud)

因此,第一个问题是为DataElement设置Highlight属性不会导致文本框背景以黄色绘制.

另一个问题是我意识到我正在将这种样式应用于所有文本框,并且我可以在其他区域中具有实际上不包含在DataElement中的文本框,这可能会导致绑定问题.

wpf dependencies triggers styles

9
推荐指数
1
解决办法
1万
查看次数

具有可变行高的WPF DataGrid

我以编程方式创建一个DataGrid,并且需要行高度可变,以便具有多行文本的行具有很高的高度来容纳其他行.

我尝试在代码中设置RowHeight属性,但这需要一个固定值.如果我将RowHeight设置为unset,则只使用一个任意值,如果文本不适合则不会扩展.

我还希望我的DataGrid内容可以扩展,所以如果调整DataGrid的大小,实际的单元格也会调整大小,包括单元格内的字体.我可以使用Viewbox,但我遇到了Viewbox的问题,因为它不会增长到适合文本,它推卸/扩展文本以适应它.

也许我需要遍历调整大小上的所有行和列并手动设置height属性.

wpf datagrid

8
推荐指数
2
解决办法
1万
查看次数

WPF保持TreeView列表排序

我在TreeView上有一个节点,我手动填充并希望保持排序.通过用户交互,TreeViewItem上的标题可能会发生变化,它们应该移动到列表中的适当位置.

我遍历一个foreach创建了许多TreeViewItem并将它们添加到父节点.所有孩子都需要进行分类.然后我按如下方式添加SortDescription.

tviParent.Items.SortDescriptions.Add(new SortDescription("Header", ListSortDirection.Ascending));
Run Code Online (Sandbox Code Playgroud)

这会对初始列表进行排序,但是如果我在显示其中一个树视图项后更改其标题,则该项不会再次排序.标题文本更改,但列表中的项目位置保持不变.

有什么我想念的吗?

我已经尝试清除列表并重新填充它,这将起作用,但是它会在我的程序中产生一些因素,因为我在更改所选项目时有很多逻辑,并且因为我在列表中的一个树视图项目清除被选中它在我清除列表时调用所有这些逻辑,然后当我在重建列表后以编程方式重新选择项目时再次调用.

wpf treeview

7
推荐指数
1
解决办法
1万
查看次数

WPF DataGrid更改未使用区域的单元格背景颜色

我正在使用代码隐藏自定义WPF DataGrid的视觉外观.用户可以配置背景.我没有问题将数据列中的单元格的单元格背景设置为不同的颜色.但是,我还需要更改每行末尾未定义区域的单元格背景颜色.

例如,我有一行包含6列数据.行的宽度比所有列占用的宽度多,在行的右侧留下未使用的区域.我似乎无法以编程方式在代码后面更改此未使用区域的背景颜色.我想将它设置为与我在网格的其余部分中使用的相同.

有人有主意吗?请仅提供解决方案背后的代码,而不是XAML解决方案.

c# wpf datagrid

4
推荐指数
1
解决办法
6525
查看次数

TryFindResource无法找到资源

我有一个从UserControl派生的自定义WPF控件.在我的XAML文件的参考资料部分中,我为将在自定义控件上显示的项目定义了几个模板和样式.

这是我的一种风格的定义,用于绘制向下箭头.

    <Style x:Key="ArrowStyle" TargetType="Path">
        <Setter Property="Margin" Value="4"/>
        <Setter Property="Stretch" Value="Uniform"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="Data" Value="M 0 0 L 5 5 L 10 0 Z"/>
        <Setter Property="Fill" Value="{DynamicResource FormText}"/>
    </Style>
Run Code Online (Sandbox Code Playgroud)

所以,我有一个从按钮派生的自定义按钮对象.基本上它是一个显示箭头的小方形按钮.在我的自定义按钮的构造函数中,我有以下代码.

        Path Arrow = new Path();
        Arrow.Style = TryFindResource("ArrowStyle") as Style;
Run Code Online (Sandbox Code Playgroud)

但是,对TryFindResource的调用失败表明它无法定位资源.如果我将定义的样式移动到App.xaml中,它会找到它,但不会在它是自定义控件资源时找到它.

我做错了什么或错过了什么?

更新

我调用TryFindResource的自定义按钮位于自定义用户控件上.但是,由于我在自定义按钮的构造函数中调用TryFindResource,因此在调用TryFindResource时它实际上不会驻留在自定义用户控件上.创建自定义按钮后,它将添加到自定义用户控件.也许有一种不同的方式或地方放置TryFindResource,以便在按钮属于控件后调用它.

wpf resources

0
推荐指数
1
解决办法
5966
查看次数