我想知道我是否必须*
两次定义一个可交换运算符(如)!
public static MyClass operator *(int i, MyClass m)
{
return new MyClass(i * m.Value);
}
public static MyClass operator *(MyClass m, int i)
{
return new MyClass(m.Value * i);
}
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?
附加说明:亲爱的@Marc关于向量和矩阵乘法的答案是好的, 当且仅当我们假设操作数类型不同时!很明显,我们只能定义*
一次运算符来执行向量或矩阵乘法.所以我认为这不是答案.
@Marc:订单在运营商中有时很重要.
是的,但这不等同于Order在操作数中有时很重要!如果在+
操作员之前(或之后)使用操作*
员将导致不同的结果,则可以使用上述句子.例如:
0 + 2 * 2 != 0 * 2 + 2
♦
假设我们将*
运算符定义为:
public static MyClass operator *(MyClass m1, MyClass m2)
{
return new MyClass(m1.Value * m2.Value /* or some …
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
<UserControl x:Class="MyApp.MyControl"
...
xmlns:local="clr-namespace:MyApp"
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
<UserControl.Template>
<ControlTemplate>
<ControlTemplate.Resources>
<Storyboard x:Key="MyStory">
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="brdBase">
<SplineColorKeyFrame KeyTime="0:0:1" Value="Red"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border x:Name="brdBase" BorderThickness="1" BorderBrush="Cyan" Background="Black">
...
</Border>
<ControlTemplate.Triggers>
<Trigger SourceName="brdBase" Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStory}"/>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</UserControl.Template>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
上面的代码没有问题.现在,我想将关键帧值绑定到此用户控件MyStory
的DP(命名SpecialColor
),如下所示:
<Storyboard x:Key="MyStory">
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="brdBase">
<SplineColorKeyFrame KeyTime="0:0:1" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyControl}}, Path=SpecialColor}"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
Run Code Online (Sandbox Code Playgroud)
这会出错:
无法冻结此Storyboard时间轴树以跨线程使用.
使用后面的代码可以做到这一点.但是我怎么才能在XAML中做到这一点?
代码隐藏辅助解决方案:
► 步骤1:将MyStory
故事板放入brdBase
资源中.
<UserControl.Template>
<ControlTemplate>
<Border x:Name="brdBase" BorderThickness="1" …
Run Code Online (Sandbox Code Playgroud) /// <summary>\n/// Something about this generic method which works with ??? type.\n/// </summary>\n/// <typeparam name="T">\xe2\x88\x99\xe2\x88\x99\xe2\x88\x99</typeparam>\n/// <returns></returns>\npublic T Foo<T>()\n{\n \xe2\x88\x99\xe2\x88\x99\xe2\x88\x99\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n是否可以在摘要标签中写入注释以显示当前给定的通用类型。(就像视觉工作室一样)?
\n\n(例如Something about this generic method which works with string type.
我们可以在工具提示中看到Foo<string>()
)
我有一个用户控件,我想在其他项目中使用它.当我直接为其属性设置一些值时没有问题:
<local:MyUserControl prop1="val1" prop2="val2">
...
</local:MyUserControl>
Run Code Online (Sandbox Code Playgroud)
但我无法应用它的风格.我试过了:
<Window ...>
<Window.Resources>
<Style x:Key="MyUserControlStyle" TargetType="{x:Type local:MyUserControl}">
<Setter Property="prop1" Value="val1"/>
<Setter Property="prop2" Value="val2"/>
</Style>
</Window.Resources>
<Grid>
<local:MyUserControl Style="{StaticResource ResourceKey=MyUserControlStyle}">
...
</local:MyUserControl>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我哪里错了?-谢谢
我已经在我的应用程序中使用了System.ComponentModel.BindingList
它DataGridView.DataSource
.该列表非常大,需要几秒钟才能绘制出来DataGridView
.所以,我需要知道数据绑定(包括绘画)程序什么时候完成一些东西.我尝试了DataBindingComplete
事件,但它在向DataSource
属性设置值后立即发生.
提前致谢.
更新:
1.生成绑定列表[从数据库获取数据] ►~1秒
2.将其设置为DataSource
[ Binding ] ►~1秒(此时DataBindingComplete
正在抬起.)
3.绘画[显示数据DataGridView
] ►~5秒
ToolStripDropDownButton
当打开下拉菜单时,我需要更改a的背景颜色.我该怎么做?
我尝试从中继承一个类ToolStripProfessionalRenderer
然后覆盖它OnRenderDropDownButtonBackground
,但它只影响下拉菜单何时关闭.
在UserControl
我有一个类型的DP enum
(GroupStyle
类型eGroupStyle
)和类型bool
(IsGrouped
)的DP .我需要在所有可能的条件下开始一些故事板.但最后MultiDataTrigger
一件作品才有效.我哪里错了?此外,我想知道是否存在一种更简单的方法来考虑这些条件.(检查IsGrouped
一次.)
C#:
enum eGroupStyle
{
GroupStyle1,
GroupStyle2,
???,
GroupStyleN,
}
Run Code Online (Sandbox Code Playgroud)
XAML:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding GroupStyle}" Value="GroupStyle1"/>
<Condition Binding="{Binding IsGrouped}" Value="False"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Storyboard_TurnToUnselectedStyle1}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding GroupStyle}" Value="GroupStyle1"/>
<Condition Binding="{Binding IsGrouped}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Storyboard_TurnToSelectedStyle1}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding GroupStyle}" Value="GroupStyle2"/>
<Condition Binding="{Binding IsGrouped}" Value="False"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Storyboard_TurnToUnselectedStyle2}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger> …
Run Code Online (Sandbox Code Playgroud) 关于在“ WPF控件开发”书中扮演默认命令目标角色的元素,有两种不同的想法:
Page 258»命令目标是在其上引发命令的对象。ICommandSource接口包含可以设置为特定对象的CommandTarget属性。默认情况下,命令源本身被视为命令目标。
Page 262» 默认情况下,未设置CommandTarget时,将使用具有键盘焦点的元素。
此外,在本教程中,我们可以使菜单项和按钮命令目标保持未定义状态,而只有菜单项(即不是按钮)才能真正检测命令目标。那么默认的命令目标是什么?
我需要在列表项上测试的匹配条件非常耗时.而且,我知道条件将匹配不超过3项列表.
因此,检查所有列表项可能不是最好的主意; 然而,当我试图用FindFindex()
最高的方法3次,测试了超过这些情况我以前FindAll()
和Where()
.
如何加快这种方法,或者最快找到三个匹配?
| # Method Time (sec)
| -------------------------------
| 1 Find (one-by-one) 42.37
| 2 FindAll 30.17
| 3 Where 30.53
Run Code Online (Sandbox Code Playgroud)
方法#1:
{
int index;
Predicate<T> predicate = t =>
{
...
};
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t1 = myCollection[index];
myCollection.RemoveAt(index);
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t2 = myCollection[index];
myCollection.RemoveAt(index);
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t3 = myCollection[index]; …
Run Code Online (Sandbox Code Playgroud) c# ×10
wpf ×4
binding ×2
winforms ×2
xaml ×2
coding-style ×1
command ×1
datagridview ×1
generics ×1
list ×1
storyboard ×1
summary ×1
xml ×1