我创建了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.没有.如何显示滚动条?
我有以下场景:
<ScrollViewer>
<Grid>
<!--many other controls-->
<DataGrid />
</Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
现在,当我将DataGrid绑定到大量数据(大约10,000行)时,我的性能非常慢.事实上,我得到OutOfmemory异常(我有8 GB的内存)!我在某处读到这是因为ScrollViewer重写了DataGrid虚拟化(或类似的东西),但我不知道如何防止这种情况.如果我删除ScrollViewer,问题就解决了!数据加载时间不到一秒钟.
我想保留ScrollViewer(因为其他控件)并且具有良好的性能.那可能吗?如果没有,还有其他解决方案吗?
我创建了简单的窗口和应用的样式.现在,当我运行应用程序背景为黑色时:

在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) 我有一个大的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)
我正在创建这样的很多控件,正如你所看到的,重复过多.
有没有办法避免这种重复?提前感谢您的想法.
我正在制作一个WPF用户控件,我希望在绑定意义上与DataGrid控件类似.我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:您可以将DataView作为ItemsSource传递,也可以传递任何对象集合.DataGrid如何通过查看以下内容来决定是绑定到DataView列还是绑定到对象的属性:
<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我在使用 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)
我认为由于行已被删除,因此不应抛出异常(由于行处于已删除状态,因此不会违反约束)。我能做些什么吗?任何帮助表示赞赏。
我现在正在努力解决这个问题.我调用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资源管理器中的文件属性,紧接在第三行之后,文件不再是只读的.拥有所有这些,我不明白为什么在第四行抛出异常.
我试图从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:现在我试图通过逐行和替换字符串来实现相同的目标.什么都没发生!该文件仍然是相同的.如果有人有类似的问题,请帮助我.
我发现了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表达式的末尾,问题就解决了.
谁能解释我为什么会这样?谢谢.
我正在使用 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)
问题是线程完成后(通过“临界点”线后)内存没有被释放。我认为当线程不活动时,与它相关的所有资源都会被释放。但显然这不是真的。任何人都可以向我解释为什么以及我做错了什么。谢谢。
我试图通过使用某些类型的字符串表示来摆脱一些引用.但是编译器不允许我按照通用方法的方式进行操作.我试过这个:
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# ×11
.net-4.0 ×4
wpf ×4
binding ×1
datagrid ×1
datatable ×1
file-access ×1
generics ×1
ienumerable ×1
linq-to-xml ×1
performance ×1
scroll ×1
xaml ×1
xelement ×1