小编Sem*_*ike的帖子

在另一个表达式中评估C#表达式

我想在另一个中使用表达式:

Expression<Func<double, double>> f = x => x * x * 27 + blah ... expression with x;

Expression<Func<double, double>> g = y => 3 + 8 * f.Compile()(y) * y * blah... expression with y and f(y);
Run Code Online (Sandbox Code Playgroud)

这在发送到LINQ to SQL时不起作用,因为SQL不知道f.Compile().

如何fy不编译变量的情况下评估变量上的表达式,但仍然使用常规语法来定义g

我不想g用一些不可读Expression.Add/ Expression.Multiply等语句定义所有内容.

谢谢.

c# expression-trees linq-to-sql

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

如何在Grid.Row/Grid.Column中引用行/列定义?

这可能很明显......我如何在同一个XAML文件中引用XAML元素?

例:

<Grid.RowDefinitions>
    <RowDefinition Height="661*" Name="someGridRow" />
    <RowDefinition Height="230*" Name="someOtherGridRow"/>
</Grid.RowDefinitions>
Run Code Online (Sandbox Code Playgroud)

然后我在网格中定义了各种控件,我想按名称而不是数字来引用这些行:

<RichTextBox Grid.Row="someGridRow" ... />
Run Code Online (Sandbox Code Playgroud)

因为如果我Grid.Row="0"在许多控件上使用,那么当我在第一行之前添加一行时,我必须Grid.Row="1"手动更改所有引用.

谢谢.

编辑:

感谢答案,我一直在阅读XAML.

毕竟,显然可以通过名称引用前一个元素:

Grid.Row="{Binding ElementName=someGridRow}"
Run Code Online (Sandbox Code Playgroud)

要么

Grid.Row="{x:Reference someGridRow}"
Run Code Online (Sandbox Code Playgroud)

但这并没有完全解决问题,因为Grid.Row需要一个int,而someGridRow不是一个int,它是一个System.Windows.Controls.RowDefinition.

所以需要的是XAML等价物

Grid.Row = grid.RowDefinitions.IndexOf(someGridRow)
Run Code Online (Sandbox Code Playgroud)

在后面的代码中将写入

Grid.SetRow(richTextBox, grid.RowDefinitions.IndexOf(someGridRow))
Run Code Online (Sandbox Code Playgroud)

或者Grid.Row在对象上对属性进行绑定,该对象grid具有"RowDefinitions.IndexOf"带参数的路径someGridRow:

PropertyPath path = new PropertyPath("RowDefinitions.IndexOf", someGridRow);
Binding binding = new Binding() { ElementName = "grid", Path = path };
richTextBox.SetBinding(Grid.RowProperty, binding);
Run Code Online (Sandbox Code Playgroud)

(这实际上在C#中不起作用,所以我必须做错事,尽管Grid.SetRow上面有效)

XAML 2009定义<x:Arguments>了调用具有参数的构造函数.如果在WPF XAML中有效,那么我想这样的东西会起作用吗?

<Grid.Row>
  <Binding ElementName="grid"> …
Run Code Online (Sandbox Code Playgroud)

wpf xaml reference

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

等到控制布局完成

我正在将很多富文本加载到RichTextBox(WPF)中,我想滚动到内容的结尾:

richTextBox.Document.Blocks.Add(...)
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
Run Code Online (Sandbox Code Playgroud)

这不起作用,ScrollToEnd在布局未完成时执行,因此它不会滚动到结尾,它会滚动到文本的前三分之一左右.

有没有办法强制等待,直到RichTextBox完成绘画和布局操作,以便ScrollToEnd实际滚动到文本的末尾?

谢谢.

不起作用的东西:

编辑:我已经尝试过这个LayoutUpdated事件,但它立刻被解雇了,同样的问题:当它被解雇时,控件仍然在richtextbox里面放置更多的文本,所以即使ScrollToEnd它没有工作......我试过这个:

richTextBox.Document.Blocks.Add(...)
richTextBoxLayoutChanged = true;
richTextBox.UpdateLayout();
richTextBox.ScrollToEnd();
Run Code Online (Sandbox Code Playgroud)

并在richTextBox.LayoutUpdated事件处理程序内:

if (richTextBoxLayoutChanged)
{
    richTextBoxLayoutChanged = false;
    richTextBox.ScrollToEnd();
}
Run Code Online (Sandbox Code Playgroud)

事件被正确触发但是过早,richtextbox在触发时仍然添加更多文本,布局未完成,因此ScrollToEnd再次失败.

编辑2:关注dowhilefor的回答:InvalidateArrange上的MSDN说

失效后,元素将更新其布局,除非随后由UpdateLayout强制,否则将以异步方式进行.

甚至

richTextBox.InvalidateArrange();
richTextBox.InvalidateMeasure();
richTextBox.UpdateLayout();
Run Code Online (Sandbox Code Playgroud)

不要等待:在这些调用之后,richtextbox仍然会添加更多文本并异步地将其放在自身内部.ARG!

wpf layout richtextbox loaded

9
推荐指数
2
解决办法
8011
查看次数

Direct2D中的像素

在此输入图像描述

深灰色线应该是黑色和1像素宽:

pRT->DrawLine(Point2F(100, 120), Point2F(300, 120), blackbrush, 1);
Run Code Online (Sandbox Code Playgroud)

浅灰色线应该是黑色和0.5像素宽:

pRT->DrawLine(Point2F(120, 130), Point2F(280, 130), blackbrush, 0.5);
Run Code Online (Sandbox Code Playgroud)

相反,它们都是2像素宽.如果我要求宽2像素,则线条为黑色,但自然宽2像素.

渲染目标具有与窗口的客户区域相同的大小.我希望像GDI中的像素精度,一个坐标=一个像素和纯色......

谢谢.

direct2d

9
推荐指数
2
解决办法
4008
查看次数

有效地存储和显示富文本

我需要在SQL数据库中存储大量的富文本,检索它并显示它.

一个字体是好的但我需要不同的字体大小/粗体/颜色.

现在我使用RichTextBox(WPF)来显示它,并使用XamlWriter.Save/XamlReader.Parse将其序列化为字符串以存储在DB中.它运行良好,但RichTextBox在显示文本时非常慢,它基本上无法使用.

是否有一种快速的方法来实现可接受的性能?

我正在考虑使用GlyphRun对象,将每个角色绘制为位图并计算所有对齐要求以适应目标图像等...但是在简单的彩色/可调整大小的文本上重新发明轮子在2011年看起来很奇怪.

编辑:谢谢你的答案,直到现在才看到他们,对不起.

文本也是由用户从RichTextBoxes 输入的,基本上我只是将结果保存string XamlWriter.Save(richTextBox.Document)在数据库中.其他字段(double/int等)也由用户从TextBoxes 输入.

当用户查询数据库时,使用数据库中的字段从头开始生成带有颜色和格式的只读富文本页面,包括上面保存的富文本字段:这些字段从FlowDocuments 转换为Spans,一些替换在它们(InlineUIContainer托管一个派生类的类,UIElement它引用了一个数据库条目,在文本中内联,如"see [thisbook]",其中[thisbook]引用了一些数据库条目的ID).MSDN说这一切都太多了TextBlock.

那个文本渲染是非常缓慢的部分,但没有办法解决它,我需要格式化,这就是WPF RichTextBoxes的方式:即使在es中输入一个简单的文本,RichTextBox打字和字符出现之间也会有延迟屏幕上...

现在我还在用RichTextBoxES,但我一直很多渲染的布局在内存(Paragraph/ Section/ Span对象),我小心地重新描绘只格式化文本可能最少的时候更改/查询作出或请求对数据库数据的不同视图由用户.

它仍然不是很快,但它的确定,改变整个结构(AvalonEdit或FormattedTextGlyphRun)似乎不值得,现在,太多的工作,整个序列化API与XamlWriter.SaveXamlReader.Parse简化了很多(为FormattedTextGlyphRun,我不得不拿出我自己的文件格式,用于将格式化文本保存到数据库中).

也有使用的OpenXML SDK,以创建Word文档的.docx的可能性,但谷歌表示,渲染性能是不算很好,我不知道,如果一个嵌入UIElement在内的文字InlineUIContainer和序列化到保存在数据库是可能的(与AvalonEdit相同的问题).

c# wpf performance richtextbox

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

C# 宏样式泛型

我正在寻找一种方法来拥有仅在编译时存在的泛型,以便代码重用:不必复制/粘贴类和方法。基本上只是文本替换,就像宏一样,带有一些类型检查。更像是 C++ 模板。

我问的原因:

普通的 C# 泛型坚持总是在运行时创建泛型类型(为什么??),

1) 不仅会产生不必要的限制(例如不能从类型参数继承,这将非常有用),

2) 但是这些运行时泛型类型现在给我带来了问题,因为 .NET 无法序列化它们,所以当我将它们插入 RichTextBox 时,许多操作要么失败,要么抛出“无法序列化泛型类型”异常。一切都在使用非泛型类型,但我想让代码更通用以添加内容,因此我添加了泛型(C# Generic Inheritance 解决方法),但它们破坏了一切。

谢谢。

c# generics macros templates

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

C#通用继承解决方法

例:

我想要从TextBox或RichTextBox派生几个专门的文本框,它们都派生自TextBoxBase:

class CommonFeatures<T> : T where T : TextBoxBase
{
  // lots of features common to the TextBox and RichTextBox cases, like
    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
        //using TextBoxBase properties/methods like SelectAll();  
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

class SpecializedTB : CommonFeatures<TextBox>
{
    // using properties/methods specific to TextBox
    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
        ... base.OnTextChanged(e); 
    }
}
Run Code Online (Sandbox Code Playgroud)

class SpecializedRTB : CommonFeatures<RichTextBox>
{
    // using methods/properties specific to RichTextBox
}
Run Code Online (Sandbox Code Playgroud)

不幸

class CommonFeatures<T> : T where T : TextBoxBase …
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance

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