小编Sin*_*atr的帖子

typeof()有效,GetType()在检索属性时不起作用

我试图private通过反射检索属性的值

// definition
public class Base
{
    private bool Test { get { return true; } }
}
public class A: Base {}
public class B: Base {}

// now
object obj = new A(); // or new B()

// works
var test1 = typeof(Base).GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic);
if(test1 != null) // it's not null
    if((bool)test1.GetValue(obj, null)) // it's true
        ...

// doesn't works!
var test2 = obj.GetType().GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic);
if(test2 != null) // is null ! …
Run Code Online (Sandbox Code Playgroud)

c# reflection

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

隐形打开弹出窗口

第二天打这个问题.

要重现,请创建新的WPF应用程序xaml

<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
    <Button Width="100" Height="100" MouseMove="Button_MouseMove"/>
    <Popup x:Name="popup" StaysOpen="False" AllowsTransparency="True" Placement="Center">
        <TextBlock>Some random text</TextBlock>
    </Popup>
    <CheckBox IsChecked="{Binding (Popup.IsOpen), ElementName=popup}">Popup</CheckBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

和代码

private void Button_MouseMove(object sender, MouseEventArgs e)
{
    popup.IsOpen = true;
}
Run Code Online (Sandbox Code Playgroud)

鼠标悬停按钮打开弹出窗口,单击其他位置关闭.单击按钮有bug:popup是IsOpen == true(可以在复选框上看到或在处理程序中有断点),而它是不可见的.

WTF?

而我的原始问题似乎是什么设置IsOpen不是即时的.为了例如,当我尝试将它设置为falsePopupMouseMove事件,然后我得到MouseEnterMouseMove事件Button期间解雇权

IsOpen = true;
Run Code Online (Sandbox Code Playgroud)

与设置相同,会发生true2(!)个MouseMove事件,将此行放入事件处理程序以查看它

System.Diagnostics.Trace.WriteLine("M");
Run Code Online (Sandbox Code Playgroud)

在VS 的输出窗口中将有2 M ,而Popup(当StayOpen=false)假设捕获鼠标事件时,它会,但不是立即.

有人可以解释一下它发生了什么吗?我希望 …

c# wpf popup

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

视图中的控件如何从视图模型中获取特定数据?

我有多个视图(用户控件),每个视图都有自己的ViewModel. 为了在它们之间导航,我使用按钮。按钮显示来自相应视图模型的图像和文本,并且还需要列和行(因为有 10 个视图:10 个列,每个列的行数不同)。

现在按钮是动态创建的(我为此做了一个Navigator控件),对于视图模型,我有基类来保存文本、图像、列和行。可用的视图数量会有所不同(取决于用户级别和某些设置),这就是我需要在这里进行控制的原因。

问题:我的控件如何从视图模型中获取数据?

现在我有 interface INavigator,在(lol)控件本身中定义。并且视图模型实现了它。我可以去对面,让我的控制,以了解有关视图模型。两者看起来都不对。


有一个Navigator控件,可以说,Items绑定到视图模型列表。它可以将每个视图模型投射到INavigatorViewModelBase(所有页面通用)以获取特定的视图模型图像、文本、列和行。因此,要么视图模型知道控制(实现INavigator),要么控制知道ViewModelBase.. 这是一个问题,这两个解决方案都绑定了紧密的控制和视图模型,这在mvvm.


示意图 在此处输入图片说明

c# wpf mvvm

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

Min() 和 Max() 还是单个老派的 foreach?

如果我有大量收藏并且我关心性能,我是否应该相信奇迹并使用

var min = Y.Min();
var max = Y.Max();
Run Code Online (Sandbox Code Playgroud)

或者我最好成为一名优秀的工程师并使用

var max = double.NegativeInfinity;
var min = double.PositiveInfinity;
foreach(var y in Y)
{
    if(y > max)
        max = y;
    if(y < min)
        min = y;
}
Run Code Online (Sandbox Code Playgroud)

YICollection<double>,因为我需要Countforeach。我很好奇类型是否正确,因为最小/最大,并且我需要从末尾迭代集合,所以会有

Y.OrderByDescending((o) => o)...
Run Code Online (Sandbox Code Playgroud)

c# linq performance

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

智能DropShadowEffect

是否有可能有DropShadowEffect忽略渲染阴影时,某些颜色?有一种蒙面(颜色选择性)阴影?

我的问题是可以将阴影分配给整个视觉元素(图形).它看起来像这样:

而且我要

注意没有阴影的网格线(除了0,0一些).这可以通过在缩放/偏移图中具有2个同步来实现,一个没有阴影效果包含网格而另一个阴影包含其余部分.但我对这个解决方案并不是很满意(我预测未来会有很多问题).所以我宁愿以DropShadowEffect某种方式修改.

我可以创建和使用ShaderEffect,但我不知道如何编写着色器以获得实际的阴影效果(如果它可以由着色器生成).

也许有更容易的方式与DropShadowEffect自己做一些事情?任何人?

编辑

我试着制作着色器效果:

sampler2D _input : register(s0);
float _width : register(C0);
float _height : register(C1);
float _depth : register(C2); // shadow depth

float4 main(float2 uv : TEXCOORD) : COLOR
{
    // get pixel size
    float2 pixel = {1 / _width, 1 / _height};

    // find color at offset
    float2 offset = float2(uv.x - pixel.x * _depth, uv.y - pixel.y * _depth); …
Run Code Online (Sandbox Code Playgroud)

wpf

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

无法将指定的值分配给集合

编辑

这让我困扰了将近一年.我会更新答案并添加赏金.

我有自定义控件,它具有依赖属性

public class Graph : Control
{
    public List<Figure> Figures
    {
        get { return (List<Figure>)GetValue(FiguresProperty); }
        set { SetValue(FiguresProperty, value); }
    }
    public static readonly DependencyProperty FiguresProperty =
        DependencyProperty.Register("Figures", typeof(List<Figure>), typeof(Graph),
        new PropertyMetadata((d, e) => ((Graph)d).InvalidateVisual()));
    ...
}
Run Code Online (Sandbox Code Playgroud)

Figure 是所有数字的基类:

public abstract class Figure { ... }

public class LineFigure : Figure { ... }
public class XGridFigure : Figure { ... }
public class YGridFigure : Figure { ... }
...
Run Code Online (Sandbox Code Playgroud)

现在看下面的截图来看问题:有时候(在其他地方对xaml进行更改之后)设计师对它疯狂并停止渲染整个窗口,抛出异常,而代码编译并运行没有问题.我可以关闭这个xaml(设计师)并再次打开它以使问题消失.但它总是重新出现.

问题:我身边有什么问题吗?缺少属性?错误的用法?我该如何解决这个问题?


老问题

丑陋的情况. …

c# wpf xaml

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

在哪里取消订阅活动?

例如,对于一般类型,它在构造函数中订阅一些事件:

class SomeType
{
    public SomeType(...)
    {
        someEvent1 += ...
        someEvent2 += ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我在哪里取消订阅活动?

  • 终结器?
  • IDisposable
  • 一些方法DontForgetToCallMeSoICanUnsubscribeFromEvents()
  • 使用弱事件模式?

我知道这要看情况。对于控件(wpf、winforms),有一些事件可用于订阅/取消订阅,例如Loaded/ UnloadedHandleCreated/HandleDestroyed等。但是如果父级是一个简单的怎么办object

还有一些更具体的示例:嵌套 ViewModel,其中每个级别都是一个List<NextLevelVM>,在任何级别 ViewModel 都可以被删除,这是否意味着每个 ViewModel 必须实现IDisposable(如果是正确的方式)它调用Dispose列表中的每个项目?我尝试使用弱事件,但效果并不好

c# events

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

ContentPresenter版式传递

我正在尝试分析wpf应用程序(以加快ListView显示复杂的多列datatemplated项目)。我在理解应用程序时间表报告中的数据时遇到了问题:

说明说:

这是此列模板(xaml):

<GridViewColumn Header="Header">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <StackPanel>
                <StackPanel Orientation="Horizontal">
Run Code Online (Sandbox Code Playgroud)

问题:

  • 什么是“元素”作为时间轴项目的类型?是布局通过(据我了解)还是其他?
  • 为什么子项的总和(仅一个子= 0.33 ms)不等于总时间(7.82 ms)?
  • ContentPresenter7.5毫秒在做什么?

c# wpf profiler xaml

5
推荐指数
0
解决办法
206
查看次数

反序列化期间如何忽略$ type

我有2个这样的课程

class A: Base
{
    public string CommonField;
    public int IntField;
}

class B: Base
{
    public string CommonField;
    public double DoubleField;
}
Run Code Online (Sandbox Code Playgroud)

A使用类型名称处理序列化实例

{
  "$type": "MyApp.A, MyApp",
  "CommonField": "SomeValue",
  "IntField": 123,
  "SomeBaseField": 321
}
Run Code Online (Sandbox Code Playgroud)

从中获取B实例的最简单方法是什么?在问为什么之前,它是关于导入A为的B(它们具有基本属性,并且您所看到的名称匹配,因此此操作是合理的)。

试图反序列化给定的json B将抛出

Newtonsoft.Json.JsonSerializationException: Type specified in JSON 'MyApp.A, MyApp, Version=0.0.1.1, Culture=neutral, PublicKeyToken=null' is not compatible with 'MyApp.B, MyApp, Version=0.0.1.1, Culture=neutral, PublicKeyToken=null'. Path '$type', line 2, position 42.
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(JsonReader reader, Type& objectType, JsonContract& contract, JsonProperty …
Run Code Online (Sandbox Code Playgroud)

c# json.net

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

带有资源字典的共享项目(xaml)

我正在寻找一种ResourceDictionary在项目之间共享的方法。

将新项目添加到共享项目不提供资源字典。它可以在其他(主)项目中创建并拖动。但是我无法将其构建选项更改为Page

在此输入图像描述

这个想法是像这样加载资源字典

var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)

目前这显然失败了

“System.IO.IOException”类型的异常出现在PresentationFramework.dll中,但未在用户代码中处理

附加信息:无法找到资源“dictionary2.xaml”。

有任何想法吗?

c# wpf xaml resourcedictionary shared-project

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