首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#代表操作是如何用F#编写的?

C#代表操作是如何用F#编写的?
EN

Stack Overflow用户
提问于 2020-10-28 21:28:08
回答 1查看 48关注 0票数 0

如何在C#中实现F#操作?

我在C#代码背后有以下代码:

代码语言:javascript
复制
public MainWindow()
        {
            InitializeComponent();
            ViewModel = new ViewModel();
            DataContext = ViewModel;
        }

        private void ListView_PreviewMouseLeftButtonUp(object _, MouseButtonEventArgs e)
        {
            _closeAdorner();
        
            // listView here equals object _  
            var listView = (ListView)e.Source;
            var grid = (Grid)listView.Parent;
            var selecteditem = (InnerRow)listView.SelectedItem;
            ViewModel.Visit = selecteditem;
            ViewModel.LastName = selecteditem.LastName;
        
            var adornerLayer = AdornerLayer.GetAdornerLayer(grid);
            if (adornerLayer == null)
                throw new ArgumentException("datagrid does not have have an adorner layer");

            var adorner = new DataGridAnnotationAdorner(grid);
            adornerLayer.Add(adorner);
        
           _closeAdorner = () => adornerLayer.Remove(adorner);
        }

我正在尝试将其转换为F#:

代码语言:javascript
复制
let handlePreviewMouseLeftButtonUp (obj: obj) (a, c) =
      let e = (obj :?> MouseButtonEventArgs)
      let listView = e.Source :?> ListView   // This is the ListView control that was clicked.
      let grid = listView.Parent :?> Grid
          
      let selectedItem = c.InnerRows |> List.filter (fun r -> Some r.Id = c.SelectedInnerRow) |> List.head
    
      let adorner = DataGridAdorner(grid)

      let installAdorner =
        let adornerLayer = AdornerLayer.GetAdornerLayer(grid)
        if (adornerLayer.GetAdorners = []) then adornerLayer.Add(adorner) else adornerLayer.Remove(adorner)

最后一行: if (adornerLayer.GetAdorners = []),然后adornerLayer.Add(装饰品)adornerLayer.Remove(装饰器)

显然不编译,也不正确。如何将C# _closeAdorner编写成在F#中具有相同的函数?

谢谢。

提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-29 00:16:17

我不知道_closeAdornerInnerRowDataGridAdorner和其他元素是什么。无论如何,这里我修复了代码中的一些语法问题(不是全部):

代码语言:javascript
复制
let handlePreviewMouseLeftButtonUp(obj : obj) (e:MouseButtonEventArgs)  =
    let listView = e.Source        :?> ListView   // This is the ListView control that was clicked.
    let grid     = listView.Parent :?> Grid
        
    let selectedItem = listView.SelectedItem :?> InnerRow//  |> List.filter (fun r -> Some r.Id = c.SelectedInnerRow) |> List.head
    
    let adorner = DataGridAdorner(grid)

    let installAdorner =
        let adornerLayer = AdornerLayer.GetAdornerLayer(grid)
        if adornerLayer.GetAdorners(grid) = [||] then adornerLayer.Add(adorner) else adornerLayer.Remove(adorner)
    ()

在构造函数中,可以添加如下所示的事件处理程序:

代码语言:javascript
复制
listView.MouseUp.AddHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))

您还可以删除它:

代码语言:javascript
复制
listView.MouseUp.RemoveHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))

要创建通用Action,您可以这样做:

代码语言:javascript
复制
let action = Action<_,_>(handlePreviewMouseLeftButtonUp)

其中,<_,_>对应于操作接收的参数数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64581561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档