小编Val*_*ale的帖子

WPF DataGrid水平滚动条没有显示

我创建了4列简单的DataGrid,它超出了DataGrid的范围,并且没有显示水平滚动条.我尝试将宽度设置为每列,但没有任何改变.这是我的XAML:

<Window x:Class="WPFTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column 1" />
                <DataGridTextColumn Header="Column 2" />
                <DataGridTextColumn Header="Column 3" />
                <DataGridTextColumn Header="Column 4" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

在此输入图像描述

我也尝试用ScrollViewer包装DataGrid.没有.如何显示滚动条?

c# wpf scroll .net-4.0

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

ScrollViewer使用DataGrid降低了性能

我有以下场景:

<ScrollViewer>
    <Grid>
         <!--many other controls-->
         <DataGrid />
    </Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

现在,当我将DataGrid绑定到大量数据(大约10,000行)时,我的性能非常慢.事实上,我得到OutOfmemory异常(我有8 GB的内存)!我在某处读到这是因为ScrollViewer重写了DataGrid虚拟化(或类似的东西),但我不知道如何防止这种情况.如果我删除ScrollViewer,问题就解决了!数据加载时间不到一秒钟.

我想保留ScrollViewer(因为其他控件)并且具有良好的性能.那可能吗?如果没有,还有其他解决方案吗?

c# wpf performance xaml .net-4.0

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

WPF窗口黑背景

我创建了简单的窗口和应用的样式.现在,当我运行应用程序背景为黑色时: 在此输入图像描述

在XAML中它看起来很正常: 在此输入图像描述

是什么造成的?

这是XAML代码:

<Window SizeToContent="WidthAndHeight" 
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  x:Class="WPFTest.MainWindow">
    <Window.Style>
        <Style TargetType="Window">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Window">
                        <Grid Name="LayoutRoot" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>

                            <Grid Grid.Row="0">
                                <ContentPresenter />
                            </Grid>
                            <StatusBar Name="statusBar1" Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Top" Grid.Row="1" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Style>
    <Grid>
        <Grid Height="114" HorizontalAlignment="Center" Margin="1,0,557,622" Name="grid" VerticalAlignment="Bottom" Width="466">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="100*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="25*" />
                <RowDefinition Height="25*" />
                <RowDefinition Height="25*" />
                <RowDefinition Height="25*" />
            </Grid.RowDefinitions>
            <Label Content="Label4" Grid.Column="0" …
Run Code Online (Sandbox Code Playgroud)

c# wpf controltemplate

6
推荐指数
1
解决办法
4141
查看次数

优化大型switch语句

我有一个大的switch语句,我根据XElement的输入值创建UIElements:

public static UIElement CreateElement(XElement element) {
            var name = element.Attribute("Name").Value;
            var text = element.Attribute("Value").Value;
            var width = Convert.ToDouble(element.Attribute("Width").Value);
            var height = Convert.ToDouble(element.Attribute("Height").Value);
            //...
            switch (element.Attribute("Type").Value) {
                case "System.Windows.Forms.Label":
                    return new System.Windows.Controls.Label() {
                        Name = name,
                        Content = text,
                        Width = width,
                        Height = height
                    };
                case "System.Windows.Forms.Button":
                    return new System.Windows.Controls.Button() {
                        Name = name,
                        Content = text,
                        Width = width,
                        Height = height
                    };
                    //...
                default:
                    return null;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我正在创建这样的很多控件,正如你所看到的,重复过多.

有没有办法避免这种重复?提前感谢您的想法.

c# .net-4.0 switch-statement

5
推荐指数
2
解决办法
670
查看次数

DataGrid如何绑定到任何集合的属性?

我正在制作一个WPF用户控件,我希望在绑定意义上与DataGrid控件类似.我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:您可以将DataView作为ItemsSource传递,也可以传递任何对象集合.DataGrid如何通过查看以下内容来决定是绑定到DataView列还是绑定到对象的属性:

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

c# wpf binding datagrid

5
推荐指数
1
解决办法
519
查看次数

DataTable 在 RejectChanges 上抛出异常

我在使用 DataTable 时发现了这个错误。我向 DataTable 添加了一个主键列,然后向该表添加了一行,删除了该行,并将具有相同键的行添加到表中。这有效。当我试图调用RejectChanges()它时,我ConstraintException说价值已经存在。这是示例:

    var dataTable = new DataTable();
    var column = new DataColumn("ID", typeof(decimal));
    dataTable.Columns.Add(column);
    dataTable.PrimaryKey =  new [] {column };

    decimal id = 1;

    var oldRow = dataTable.NewRow();
    oldRow[column] = id;

    dataTable.Rows.Add(oldRow);
    dataTable.AcceptChanges();

    oldRow.Delete();

    var newRow = dataTable.NewRow();
    newRow[column] = id;

    dataTable.Rows.Add(newRow);
    dataTable.RejectChanges(); // This is where it crashes
Run Code Online (Sandbox Code Playgroud)

我认为由于行已被删除,因此不应抛出异常(由于行处于已删除状态,因此不会违反约束)。我能做些什么吗?任何帮助表示赞赏。

c# datatable .net-4.0

5
推荐指数
1
解决办法
1856
查看次数

File.Copy方法使文件不可访问

我现在正在努力解决这个问题.我调用File.Copy方法后无法访问文件.这是我尝试过的:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open);
Run Code Online (Sandbox Code Playgroud)

我在第二行收到UnauthorizedAccessException.它说:拒绝访问路径...... 我也试过这里提出的建议但是没有用.

任何帮助表示赞赏.

编辑:这是我发现的.如果我这样做:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.Read);
Run Code Online (Sandbox Code Playgroud)

它不会抛出异常.我尝试访问的文件是只读的.所以,我试图删除这样的只读属性:

File.Copy(sourceFile, destinationFile, true);
FileInfo fileInfo = new FileInfo(destinationFile);
fileInfo.IsReadOnly = false;
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.ReadWrite);
Run Code Online (Sandbox Code Playgroud)

我得到了和以前一样的例外.顺便说一句,我检查了我是否可以手动打开文件并进行编辑,我可以.当然,当我取消选中只读复选框时.我在调试时检查了Windows资源管理器中的文件属性,紧接在第三行之后,文件不再是只读的.拥有所有这些,我不明白为什么在第四行抛出异常.

c# file-access

3
推荐指数
1
解决办法
7399
查看次数

从XElement中删除属性

我试图从xml文档中删除一些属性.这是我尝试过的:

private void RemoveEmptyNamespace(XElement element) {
            foreach (XElement el in element.Elements()) {
                if (el.Attribute("xmlns") != null && el.Attribute("xmlns").Value == string.Empty)
                    el.Attribute("xmlns").Remove();
                if (el.HasElements)
                    RemoveEmptyNamespace(el);
            }
        }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.当我在方法内部调试时,属性被删除,但是当方法完全执行时,没有保存任何更改.文件是一样的.我想这是因为foreach循环,但我没有看到其他循环方式.

任何建议表示赞赏.

编辑:这是我正在使用的整个代码:

        var file = new FileStream(destinationPath, FileMode.Open);
        var doc = new XDocument();
        doc = XDocument.Load(savedFile);
        RemoveEmptyNamespace(doc.Root);//method above
        file.SetLength(0);
        doc.Save(file);
        file.Close();
Run Code Online (Sandbox Code Playgroud)

编辑2:现在我试图通过逐行和替换字符串来实现相同的目标.什么都没发生!该文件仍然是相同的.如果有人有类似的问题,请帮助我.

c# xelement

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

更改内容时,IEnumerable会减少吗?

我发现了IEnumerable的奇怪行为.当我使用Linq to XML创建集合并循环集合并更改它的元素时,每次通过循环时集合大小减少1.这就是我所说的:

    var nodesToChange =  from A in root.Descendants()
                         where A.Name.LocalName == "Compile"
                         && A.Attribute("Include").Value.ToLower().Contains(".designer.cs")
                         && A.HasElements && A.Elements().Count() == 1
                         select A;
    foreach (var node in nodesToChange) {
          //after this line the collection is reduced
          node.Attribute("Include").Value = node.Attribute("Include").Value.Replace(".Designer.cs", ".xaml");
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果我只添加ToArray<XElement>()到linq表达式的末尾,问题就解决了.

谁能解释我为什么会这样?谢谢.

c# ienumerable linq-to-xml

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

线程不活动时释放资源

我正在使用 BackgroundWorker 并在其中使用 foreach 循环,在其中我创建新线程,等待它完成,然后报告进度并继续 foreach 循环。这就是我要说的:

private void DoWork(object sender, DoWorkEventArgs e) {
            var fileCounter = Convert.ToDecimal(fileNames.Count());
            decimal i = 0;
            foreach (var file in fileNames) {
                i++;
                var generator = new Generator(assembly);

                var thread = new Thread(new ThreadStart(
                        delegate() {
                            generator.Generate(file);
                        }));
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                while (thread.IsAlive); // critical point
                int progress = Convert.ToInt32(Math.Round(i / fileCounter * 100));
                backgroundWorker.ReportProgress(progress);
            }
        }
Run Code Online (Sandbox Code Playgroud)

问题是线程完成后(通过“临界点”线后)内存没有被释放。我认为当线程不活动时,与它相关的所有资源都会被释放。但显然这不是真的。任何人都可以向我解释为什么以及我做错了什么。谢谢。

c# multithreading backgroundworker

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

为什么我不能在泛型中使用Type.GetType()?

我试图通过使用某些类型的字符串表示来摆脱一些引用.但是编译器不允许我按照通用方法的方式进行操作.我试过这个:

IContainer container = components as IContainer;
Type type = Type.GetType("MyNamespace.MyType");
foreach (var component in container.Components.OfType<Type.GetType("MyNamespace.MyType")>()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

foreach (var component in container.Components.OfType<type>()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

对于第一个循环,我得到:"运算符'<'不能应用于'方法组'和'System.Type'类型的操作数,而对于第二个循环,变量超出范围由于某种原因.为什么会发生这种情况,有办法解决吗?先谢谢.

c# generics

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