优点:
缺点:
优点:
缺点:
优点:
缺点:
我将使用方法#1.你能推荐一个更好的方法吗?
在非托管DLL中是否有基于CLR托管的体面技术?
请注意,我知道这些问题:
我曾经认为a Record
是(不可变的)数据的容器,直到我遇到一些有启发性的阅读.
鉴于函数可以被视为F#中的值,记录字段也可以保存函数值.这提供了状态封装的可能性.
module RecordFun =
type CounterRecord = {GetState : unit -> int ; Increment : unit -> unit}
// Constructor
let makeRecord() =
let count = ref 0
{GetState = (fun () -> !count) ; Increment = (fun () -> incr count)}
module ClassFun =
// Equivalent
type CounterClass() =
let count = ref 0
member x.GetState() = !count
member x.Increment() = incr count
Run Code Online (Sandbox Code Playgroud)
用法
counter.GetState()
counter.Increment()
counter.GetState()
Run Code Online (Sandbox Code Playgroud)
似乎除了继承之外,Class
用a Record
和helper函数做的事情并没有多少.其功能概念更好,例如模式匹配,类型推断,高阶函数,通用等式......
进一步分析,Record …
我有一个ListBox
基于这样的属性进行分组的地方:
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(listbox.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("CurrentDate");
view.GroupDescriptions.Add(groupDescription);
Run Code Online (Sandbox Code Playgroud)
分组后我想在组之间添加一个垂直分隔符,我写了一个这样的代码:
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
<TextBlock Text="{Binding Path=Name}"
FontWeight="Bold"/>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</ListBox.GroupStyle>
Run Code Online (Sandbox Code Playgroud)
但它看起来像这样:
虽然我想要一个分隔符完全下降,但当我试图增加分隔符的高度时,项目随之下降.
我正在将多页打印的C#代码翻译成F#.有人可以告诉我如何翻译:
((IAddChild)page1Content).AddChild(page1)
Run Code Online (Sandbox Code Playgroud)
背景:
// printdia = printdialog
// printdoc = printdocument
// create a page
let page1 = new System.Windows.Documents.FixedPage()
page1.Width <- printdoc.DocumentPaginator.PageSize.Width
page1.Height <- printdoc.DocumentPaginator.PageSize.Height
page1.Children.Add(printcanvas) |> ignore
// add the page to the document
let page1Content = new System.Windows.Documents.PageContent()
(*C#*)((IAddChild)page1Content).AddChild(page1)
printdoc.Pages.Add(page1Content) |> ignore
// and print
printdia.PrintDocument(printdoc.DocumentPaginator, ordernr.Text);
Run Code Online (Sandbox Code Playgroud)
概述:我有一个XAML Canvas控件,我在其上放置了几个Line控件.线条出现在它们不应该的位置,我的结论是所述线条的边界框是行为不端的.我不访问或更改这些边界框(据我所知).
项目详细信息:我在Visual Studio 2010中使用WPF,XAML,C#和MVVM模式.
更详细的解释:我的项目是创建一个画布,并在该画布上有可以被用户拖动的项目.在一个项目和另一个项目之间绘制线条以显示可视链接.
要进行可视化,您可以在此处查看图像:
有五个项目,在代码中,N1项目应按行链接到N3,N4和N5项目.N1到N3线看起来很好,但另外两条线是偏移的.如果你要将它们移动起来,它们会很好地将这些项目链接在一起.
你可以考虑的第一件事是画布中线条的坐标,我已经这样做了.
请查看此图片:
我在与Line相同的区域内向XAML添加了一个TextBlock,并将其Text绑定到Line的StartingPoint.如果图像很小,可能很难看到这里,但我可以告诉你,这里的两条线的StartingPont是相同的.然而,显然我们可以看到线条不在同一个地方.
我还认为这可能是一个对齐的问题.我没有在我的项目中设置任何路线,所以我想也许这就是问题所在.我将线条改为不同的对齐方式(水平和垂直方向)以及项目本身,我发现没有区别.
项目更详细:
首先是项目本身的资源.我不认为它有所作为,但由于我全都没有想法,我不能忽视这个问题可能在某个地方看不见:
<ResourceDictionary>
<ControlTemplate x:Key="NodeTemplate">
<Border BorderThickness="2" BorderBrush="LightBlue" Margin="2" CornerRadius="5,5,5,5">
<StackPanel>
<TextBlock Text="Test" Background="AntiqueWhite"/>
<TextBlock Text="{Binding Path=NodeText}" Background="Aqua"/>
</StackPanel>
</Border>
</ControlTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
现在,在下面,Canvas本身具有ItemsControls:
<Canvas>
<ItemsControl ItemsSource="{Binding NodeList, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding LineList, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Line Stroke="Black" X1="{Binding StartPoint.X}" Y1="{Binding StartPoint.Y}" X2="{Binding EndPoint.X}" Y2="{Binding EndPoint.Y}" />
<!--Path Stroke="Black" Data="{Binding}" Canvas.Left="0" Canvas.Top="0" StrokeMiterLimit="1"/-->
<TextBlock Text="{Binding StartPoint}" HorizontalAlignment="Center"/>
</StackPanel>
</DataTemplate> …
Run Code Online (Sandbox Code Playgroud)