试图制作Feature
通用然后突然编译说
接线员'?' 不能应用于'T'类型的操作数
这是代码
public abstract class Feature<T>
{
public T Value
{
get { return GetValue?.Invoke(); } // here is error
set { SetValue?.Invoke(value); }
}
public Func<T> GetValue { get; set; }
public Action<T> SetValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
可以使用此代码
get
{
if (GetValue != null)
return GetValue();
return default(T);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道如何修复那个漂亮的C#6.0单线程.
我对VS2015中XAML Designer的默认缩放感到非常恼火(不确定版本是否相关),这是Fit all
默认情况下.
有没有办法将其设置为100%
默认值?禁用缩放功能也是一种选择.但有没有在VS相关Settings
- XAML Designer
.
PS:用语言标记它,以便像我这样的人看到,他们只看标记的问题(在我的情况下C#
).
的C#9的记录功能规范包括以下内容:
一个记录类型包含两个复制成员:
采用记录类型的单个参数的构造函数。它被称为“复制构造函数”。具有编译器保留名称的合成公共无参数实例“克隆”方法
但我似乎无法调用这两个复制成员中的任何一个:
public record R(int A);
// ...
var r2 = new R(r); // ERROR: inaccessible due to protection level
var r3 = r.Clone(); // ERROR: R does not contain a definition for Clone
Run Code Online (Sandbox Code Playgroud)
由此,我了解到构造函数是受保护的,因此无法在记录的继承层次结构之外访问。所以我们只剩下这样的代码:
var r4 = r with { };
Run Code Online (Sandbox Code Playgroud)
但是克隆呢?根据上述规范,克隆方法是公开的。但它的名字是什么?或者它是一个有效的随机字符串,因此不应在记录的继承层次结构之外调用它?如果是这样,深复制记录的正确方法是什么?从规范看来,人们可以创建自己的克隆方法。是这样吗,它应该如何工作的一个例子是什么?
根据标题.
我正在编写一个程序,所有组件都可以根据表单的大小自动调整大小.
当我使用this.Width
和this.Height
属性时,它的返回值是整个表单的宽度和高度(红框).
如何获得表格内部区域(绿框)的宽度和高度?
我正在使用DefaultValue
属性来表示正确的PropertyGrid
行为(它以粗体显示与默认值不同的值).现在,如果我想使用XmlSerializer
在xml文件中对没有默认值的属性的条目来序列化显示的对象.
告诉XmlSerializer序列化这些仍然是最简单的方法是什么?
我需要它来支持"版本",所以当我稍后在代码中更改默认值时 - serialized属性获取它已序列化的值,而不是"最新"的值.我可以考虑以下事项:
PropertyGrid
(使用自定义属性,因此将被忽略XmlSerializer
);DefaultValue
;XmlSeriazer
因此不再包含对象DefaultValue
.但是我有可能错过了一些秘密财产,它可以做到这一点而没有太大的痛苦= D.
这是我想要的一个例子:
private bool _allowNegative = false;
/// <summary>
/// Get or set if negative results are allowed
/// </summary>
[Category(CategoryAnalyse)]
[Admin]
[TypeConverter(typeof(ConverterBoolOnOff))]
//[DefaultValue(false)] *1
public bool AllowNegative
{
get { return _allowNegative; }
set
{
_allowNegative = value;
ConfigBase.OnConfigChanged();
}
}
//public void ResetAllowNegative() { _allowNegative = false; } *2
//public bool ShouldSerializeAllowNegative() { …
Run Code Online (Sandbox Code Playgroud) 问题:给定IEnumerable<>
,如何检查哪些序列包含多个x
项目?
MCVE:
static void Main(string[] args)
{
var test = Test().Where(o => o > 2 && o < 6); // ToList()
if (test.Count() > 1) // how to optimize this?
foreach (var t in test) // consumer
Console.WriteLine(t);
}
static IEnumerable<int> Test()
{
for (int i = 0; i < 10; i++)
yield return i;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是什么Count()
将运行完整序列和那些1E6
+项目(ToList()
也是坏主意).我也不被允许更改消费者代码(这是接受完整序列的方法).
我有ListView
(默认情况下虚拟化),它ItemsSource
绑定到ObservableCollection<Item>
属性.
当填充数据(设置属性并且通知上升)时,我在分析器中看到2个布局峰值,第二个在调用后发生listView.ScrollIntoView()
.
我的理解是:
ListView
通过绑定加载数据ListViewItem
,并从索引0开始为屏幕上的项创建.listView.ScrollIntoView()
.ListView
第二次(创造ListViewItem
s).如何防止去虚拟化发生两次(我之前不希望ScrollIntoView
发生这种情况)?
我试着用一个repro ListBox
.
XAML:
<Grid>
<ListBox x:Name="listBox" ItemsSource="{Binding Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
<Button Content="Fill" VerticalAlignment="Top" HorizontalAlignment="Center" Click="Button_Click" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
CS:
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public class ViewModel : …
Run Code Online (Sandbox Code Playgroud) 我一直在研究如何避免因INotifyCollectionChanged
视图模型对事件的强引用而导致的内存泄漏.我正在玩一个ListCollectionView
用来查看是否会为我处理它.我认为以下是泄漏记忆,我做错了什么?
var stuff = new ObservableCollection<string>();
while (true)
{
var result = new ListCollectionView(stuff);
// Just to keep make sure that the memory I'm seeing
// isn't waiting to be GC'd
GC.Collect();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试Grid
使用GridSplitter
单击按钮时隐藏列中的列(该按钮将第三列中所有项目的可见性设置为折叠).如果我不移动GridSplitter
它正常工作,第三列消失,但如果我移动GridSplitter
内容消失但其他列不调整大小以填充空白空间.
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="a" Width="*"/>
<ColumnDefinition x:Name="b" Width="3"/>
<ColumnDefinition x:Name="c" Width="Auto" MaxWidth="600"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Background="Green">
<Image Source="te/Dante.png" Height="Auto" Margin="0,128,2,71"/>
</Border>
<Button Grid.Column="0" Grid.Row="0" Width="30" Height="30" Margin="0,10,10,0" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Button_Click"></Button>
<GridSplitter Width="5" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" ResizeDirection="Columns" HorizontalAlignment="Left" Background="White" BorderBrush="Black" BorderThickness="1,0" ResizeBehavior="PreviousAndCurrent"/>
<WrapPanel x:Name="wpC" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" MinWidth="300" HorizontalAlignment="Stretch" Background="Aqua" Panel.ZIndex="-1"></WrapPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这是我的问题的一个例子(gif):
我怎么解决这个问题?可能尊重MVVM模式.
我有一个WPF Datagrid,它有一个Collection View Source,上面有3个级别的分组.
我已经设置了datagrid样式以使用3个扩展器,使它看起来像这样:
Level 1 Expander
<content>
Level 2 Expander
<content>
Level 3 Expander
<content>
Run Code Online (Sandbox Code Playgroud)
2级和1级只是组的标题
我有第二个控件允许用户显示和隐藏3级项目,这些项目通过将Level 3扩展器绑定到后面对象中的布尔"IsVisible"属性来工作.
<!-- Style for groups under the top level. this is the style for how a sample is displayed -->
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<!-- The parent control that determines whether or not an item needs to be displayed. This holds all of the sub controls displayed for a sample …
Run Code Online (Sandbox Code Playgroud)