Aracılığıyla paylaş


İzlenecek yol: taşınabilir F# kitaplığı oluşturma

Bu yolu izleyerek, F# üzerinde Silverlight uygulaması, geleneksel bir masaüstü uygulaması veya .NET API'larını kullanarak oluşturduğunuz bir Windows Mağazası uygulaması ile kullanabileceğiniz bir derleme oluşturabilirsiniz. Bu şekilde, uygulamanızın UI bölümünü C# veya Visual Basic gibi başka bir .NET dilinde yazabilir ve ayrıca F# öğesinin algoritmik kısmını yazabilirsiniz. Aynı zamanda farklı platformları hedefleyen farklı kullanıcı arabirimlerini destekleyebilirsiniz.

Windows Mağazası UI öğesini doğrudan F# üzerinden kullanamazsınız, bu nedenle Windows Mağazası uygulamanız için UI öğesini farklı bir .NET dilinde yazmanızı ve F# kodunu taşınabilir bir kitaplıkta yazmanızı öneririz. Silverlight ve Windows Presentation Foundation (WPF) UI öğesini doğrudan F# içerisinde yazabilirsiniz, ancak Visual Studio'da C# veya Visual Basic kodu yazarken mevcut olan ek tasarı araçlarından da yararlanmak isteyebilirsiniz.

Önkoşullar

Bir Windows Mağazası uygulaması oluşturmak için geliştirme bilgisayarınızda Windows 8 olması gerekir.

Bir Silverlight projesi oluşturmak için geliştirme bilgisayarınızda Silverlight 5 olması gerekir.

Çalışma Kitabı Uygulaması

Bu yöntem ile kullanıcıya bir kılavuz sunan ve hücrelerinde numerik giriş ve formülleri kabul eden basit bir çalışma kitabı geliştirirsiniz. F# katmanı tüm girişleri işler ve geçerli hale getirir, özellikle de formül metnini çözümler ve formül sonuçlarını hesaplar. Öncelikle, F# algoritmik kodunu oluşturursunuz, bu kod referans, sayı ve matematiksel işlemciler içeren ayrıştırılmış ifadeler için kod içerir. Bu uygulama aynı zamanda bir kullanıcı başka bir hücrenin içeriğini güncellediğinde hangi hücrelerin güncellenmesi gerektiğini izleyecek bir kod içerir. Ardından, kullanıcı arayüzlerini oluşturursunuz.

Aşağıdaki resim bu yönergelerde oluşturacağınız uygulamayı gösterir.

Çalışma Kitabı Uygulaması Kullanıcı Arabirimi

Son app F# taşınabilir Walkthrough ekran görüntüsü

Bu örneklerde aşağıdaki bölümler bulunur:

  • How To: Create an F# Portable Library

  • How To: Create a Silverlight App that Uses an F# Portable Library

  • How To: Create a ... Style App That Uses an F# Portable Library

  • How to: Create a Desktop App That References a Portable Library That Uses F#

Nasıl Yapılır: F# Taşınabilir Kitaplığı Oluşturma

  1. Menü çubuğunda, Dosya, Yeni Proje seçeneğini belirleyin. Yeni proje iletişim kutusunda, Visual F# öğesini genişletin, F# Taşınabilir kitaplığı proje türünü seçin ve ardından kitaplığı Çalışma Kitabı olarak adlandırın. Projenin FSharp.Core'un özel bir sürümüne referans yaptığını unutmayın.

  2. Çözüm Gezgininde, Referans düğümünü genişletin ve ardından FSharp.Core düğümünü seçin. Özellikler penceresinde, FullPath özelliğinin değeri .NETPortable içermelidir, bu Core F# kitaplığının taşınabilir sürümünü kullandığınızı gösterir. Varsayılan olarak erişebildiğiniz .NET kitaplıklarını da inceleyebilirsiniz. Bu kitaplıkların hepsi .NET taşınabilir olarak adlandırılan ortak bir .NET Framework alt kümesi ile çalışır. İhtiyacınız olmayan referansları kaldırabilirsiniz, ancak referans eklerseniz, referans derlemenizin hedeflediğiniz tüm platformlarda kullanılabilir olması gerekir. Bir derlemenin belgeleri genellikle kullanılabilir olduğu platformları gösterir.

  3. Proje için kısayol menüsünü açın ve Özellikler öğesini seçin. Uygulama sekmesinde, hedef çerçeve .NET Framework Alt Kümesi olarak ayarlanmıştır. Visual Studio 2012 için, bu alt küme Windows Mağazası uygulamaları için .NET'i, .NET Framework 4.5'i ve Silverlight 5'i hedefler. Bu ayarlar önemlidir çünkü uygulamanız taşınabilir bir kitaplık olarak çeşitli platformlarda kullanılabilir olan çalışma zamanına karşı çalışmalıdır. Windows Mağazası uygulamaları için çalışma zamanları ve Silverlight 5 tam .NET Framework'ün alt kümelerini içerir.

  4. Ana kodun adını Spreadsheet.fs olarak değiştirin ve ardından aşağıdaki kodu düzenleyici penceresine yapıştırın. Bu kod temel bir çalışma kitabının işlevini tanımlar.

    namespace Portable.Samples.Spreadsheet
    
    open System
    open System.Collections.Generic
    
    [<AutoOpen>]
    module Extensions = 
        type HashSet<'T> with
            member this.AddUnit(v) = ignore( this.Add(v) )
    
    type internal Reference = string
    
    /// Result of formula evaluation
    [<RequireQualifiedAccess>]
    type internal EvalResult = 
        | Success of obj
        | Error of string
    
    /// Function that resolves reference to value.
    /// If formula that computes value fails, this function should also return failure.
    type internal ResolutionContext = Reference -> EvalResult
    
    /// Parsed expression
    [<RequireQualifiedAccess>]
    type internal Expression = 
        | Val of obj
        | Ref of Reference
        | Op of (ResolutionContext -> list<Expression> -> EvalResult) * list<Expression>
        with 
        member this.GetReferences() = 
            match this with
            | Expression.Ref r -> Set.singleton r
            | Expression.Val _ -> Set.empty
            | Expression.Op (_, args) -> (Set.empty, args) ||> List.fold (fun acc arg -> acc + arg.GetReferences())
    
    [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
    module internal Operations = 
        
        let eval (ctx : ResolutionContext) = 
            function
            | Expression.Val v -> EvalResult.Success v
            | Expression.Ref r -> ctx r
            | Expression.Op (f, args) -> try f ctx args with e -> EvalResult.Error e.Message
        
        type private Eval = Do 
            with 
            member this.Return(v) = EvalResult.Success v
            member this.ReturnFrom(v) = v
            member this.Bind(r, f) = 
                match r with
                | EvalResult.Success v -> f v
                | EvalResult.Error _-> r
    
        let private mkBinaryOperation<'A, 'R> (op : 'A -> 'A -> 'R) ctx =
            function
            | [a; b] -> 
                Eval.Do {
                    let! ra = eval ctx a
                    let! rb = eval ctx b
                    match ra, rb with
                    | (:? 'A as ra), (:? 'A as rb) -> return op ra rb
                    | _ -> return! EvalResult.Error "Unexpected type of argument"
                }
            | _ -> EvalResult.Error "invalid number of arguments"
    
        let add = mkBinaryOperation<float, float> (+)
        let sub = mkBinaryOperation<float, float> (-)
        let mul = mkBinaryOperation<float, float> (*)
        let div = mkBinaryOperation<float, float> (/)
    
        let ge = mkBinaryOperation<float, bool> (>=)
        let gt = mkBinaryOperation<float, bool> (>)
    
        let le = mkBinaryOperation<float, bool> (<=)
        let lt = mkBinaryOperation<float, bool> (<)
    
        let eq = mkBinaryOperation<IComparable, bool> (=)
        let neq = mkBinaryOperation<IComparable, bool> (<>)
    
        let mmax = mkBinaryOperation<float, float> max
        let mmin = mkBinaryOperation<float, float> min
    
        let iif ctx = 
            function
            | [cond; ifTrue; ifFalse] -> 
                Eval.Do {
                    let! condValue = eval ctx cond
                    match condValue with
                    | :? bool as condValue-> 
                        let e = if condValue then ifTrue else ifFalse
                        return! eval ctx e
                    | _ -> return! EvalResult.Error "Condition should be evaluated to bool"
                }
            | _ -> EvalResult.Error "invalid number of arguments"
        
        let get (name : string) = 
            match name.ToUpper() with
            | "MAX" -> mmax
            | "MIN" -> mmin
            | "IF" -> iif
            | x -> failwithf "unknown operation %s" x
    
    module internal Parser =
        let private some v (rest : string) = Some(v, rest)
        let private capture pattern text =
            let m = System.Text.RegularExpressions.Regex.Match(text, "^(" + pattern + ")(.*)")
            if m.Success then
                some m.Groups.[1].Value m.Groups.[2].Value
            else None
        let private matchValue pattern = (capture @"\s*") >> (Option.bind (snd >> capture pattern))
    
        let private matchSymbol pattern = (matchValue pattern) >> (Option.bind (snd >> Some))
        let private (|NUMBER|_|) = matchValue @"-?\d+\.?\d*"
        let private (|IDENTIFIER|_|) = matchValue @"[A-Za-z]\w*"
        let private (|LPAREN|_|) = matchSymbol @"\("
        let private (|RPAREN|_|) = matchSymbol @"\)"
        let private (|PLUS|_|) = matchSymbol @"\+"
        let private (|MINUS|_|) = matchSymbol @"-"
        let private (|GT|_|) = matchSymbol @">"
        let private (|GE|_|) = matchSymbol @">="
        let private (|LT|_|) = matchSymbol @"<"
        let private (|LE|_|) = matchSymbol @"<="
        let private (|EQ|_|) = matchSymbol @"="
        let private (|NEQ|_|) = matchSymbol @"<>"
        let private (|MUL|_|) = matchSymbol @"\*"
        let private (|DIV|_|) = matchSymbol @"/"
        let private (|COMMA|_|) = matchSymbol @","
        let private operation op args rest = some (Expression.Op(op, args)) rest
        let rec private (|Factor|_|) = function
            | IDENTIFIER(id, r) ->
                match r with
                | LPAREN (ArgList (args, RPAREN r)) -> operation (Operations.get id) args r
                | _ -> some(Expression.Ref id) r
            | NUMBER (v, r) -> some (Expression.Val (float v)) r
            | LPAREN(Logical (e, RPAREN r)) -> some e r
            | _ -> None
    
        and private (|ArgList|_|) = function
            | Logical(e, r) ->
                match r with
                | COMMA (ArgList(t, r1)) -> some (e::t) r1
                | _ -> some [e] r
            | rest -> some [] rest
    
        and private (|Term|_|) = function
            | Factor(e, r) ->
                match r with
                | MUL (Term(r, rest)) -> operation Operations.mul [e; r] rest
                | DIV (Term(r, rest)) -> operation Operations.div [e; r] rest
                | _ -> some e r
            | _ -> None
    
        and private (|Expr|_|) = function
            | Term(e, r) ->
                match r with
                | PLUS (Expr(r, rest)) -> operation Operations.add [e; r] rest
                | MINUS (Expr(r, rest)) -> operation Operations.sub [e; r] rest
                | _ -> some e r
            | _ -> None
    
        and private (|Logical|_|) = function
            | Expr(l, r) ->
                match r with
                | GE (Logical(r, rest)) -> operation Operations.ge [l; r] rest
                | GT (Logical(r, rest)) -> operation Operations.gt [l; r] rest
                | LE (Logical(r, rest)) -> operation Operations.le [l; r] rest
                | LT (Logical(r, rest)) -> operation Operations.lt [l; r] rest
                | EQ (Logical(r, rest)) -> operation Operations.eq [l; r] rest
                | NEQ (Logical(r, rest)) -> operation Operations.neq [l; r] rest
                | _ -> some l r
            | _ -> None
    
        and private (|Formula|_|) (s : string) =
            if s.StartsWith("=") then
                match s.Substring(1) with
                | Logical(l, t) when System.String.IsNullOrEmpty(t) -> Some l
                | _ -> None
            else None
    
        let parse text = 
            match text with
            | Formula f -> Some f
            | _ -> None
    
    type internal CellReference = string
    
    module internal Dependencies = 
    
        type Graph() = 
            let map = new Dictionary<CellReference, HashSet<CellReference>>()
    
            let ensureGraphHasNoCycles(cellRef) =
                let visited = HashSet()
                let rec go cycles s =
                    if Set.contains s cycles then failwith ("Cycle detected:" + (String.concat "," cycles))
                    if visited.Contains s then cycles
                    else
                    visited.AddUnit s
                    if map.ContainsKey s then
                        let children = map.[s]
                        ((Set.add s cycles), children)
                            ||> Seq.fold go
                            |> (fun cycle -> Set.remove s cycles)
                    else
                        cycles
    
                ignore (go Set.empty cellRef)
    
            member this.Insert(cell, parentCells) = 
                for p in parentCells do
                    let parentSet = 
                        match map.TryGetValue p with
                        | true, set -> set
                        | false, _ ->
                            let set = HashSet()
                            map.Add(p, set)
                            set
                    parentSet.AddUnit cell
                try 
                    ensureGraphHasNoCycles cell
                with
                    _ -> 
                    this.Delete(cell, parentCells)
                    reraise()
                                 
            member this.GetDependents(cell) = 
                let visited = HashSet()
                let order = Queue()
                let rec visit curr = 
                    if not (visited.Contains curr) then 
                        visited.AddUnit curr
                        order.Enqueue(curr)
                        match map.TryGetValue curr with
                        | true, children -> 
                            for ch in children do
                                visit ch
                        | _ -> ()
    
                        
                visit cell
                order :> seq<_>
    
            member this.Delete(cell, parentCells) = 
                for p in parentCells do
                    map.[p].Remove(cell)
                    |> ignore
    
    type Cell = 
        {
            Reference : CellReference
            Value : string
            RawValue : string
            HasError : bool
        }
    
    type RowReferences = 
        {
            Name : string
            Cells : string[]
        }
    
    type Spreadsheet(height : int, width : int) = 
        
        do 
            if height <=0 then failwith "Height should be greater than zero"
            if width <=0 || width > 26 then failwith "Width should be greater than zero and lesser than 26"
    
        let rowNames = [| for i = 0 to height - 1 do yield string (i + 1)|]
        let colNames = [| for i = 0 to (width - 1) do yield string (char (int 'A' + i)) |]
    
        let isValidReference (s : string) = 
            if s.Length < 2 then false
            else
            let c = s.[0..0]
            let r = s.[1..]
            (Array.exists ((=)c) colNames) && (Array.exists ((=)r) rowNames)
    
        let dependencies = Dependencies.Graph()
        let formulas = Dictionary<_, Expression>()
    
        let values = Dictionary()
        let rawValues = Dictionary()
    
        let setError cell text = 
            values.[cell] <- EvalResult.Error text
    
        let getValue reference = 
            match values.TryGetValue reference with
            | true, v -> v
            | _ -> EvalResult.Success 0.0
        
        let deleteValue reference = 
            values.Remove(reference)
            |> ignore
    
        let deleteFormula cell = 
            match formulas.TryGetValue cell with
            | true, expr ->
                dependencies.Delete(cell, expr.GetReferences())
                formulas.Remove(cell) 
                |> ignore
            | _ -> ()
    
        let evaluate cell = 
            let deps = dependencies.GetDependents cell
            for d in deps do
                match formulas.TryGetValue d with
                | true, e -> 
                    let r = Operations.eval getValue e
                    values.[d] <- r
                | _ -> ()
            deps
    
        let setFormula cell text = 
            let setError msg = 
                setError cell msg
                [cell] :> seq<_>
            
            try 
                match Parser.parse text with
                | Some expr ->
                    let references = expr.GetReferences()
                    let invalidReferences = [for r in references do if not (isValidReference r) then yield r]
                    if not (List.isEmpty invalidReferences) then
                        let msg = sprintf "Formula contains invalid references:%s" (String.concat ", " invalidReferences)
                        setError msg
                    else
                    try
                        dependencies.Insert(cell, references)
                        formulas.Add(cell, expr)
                        |> ignore
                        evaluate cell
                    with
                        e -> setError e.Message
                | _ -> setError "Invalid formula text"
            with e -> setError e.Message
    
        member this.Headers = colNames
        member this.Rows = rowNames
        member this.GetRowReferences() = 
            seq { for r in rowNames do
                  let cells = [| for c in colNames do yield c + r |]
                  yield { Name = r; Cells = cells } }
    
        member this.SetValue(cellRef : Reference, value : string) : Cell[] = 
            rawValues.Remove(cellRef)
            |> ignore
    
            if not (String.IsNullOrEmpty value) then
                rawValues.[cellRef] <- value
    
            deleteFormula cellRef
            
            let affectedCells = 
                if (value <> null && value.StartsWith "=") then
                    setFormula cellRef value
                elif String.IsNullOrEmpty value then
                    deleteValue cellRef
                    evaluate cellRef
                else
                    match Double.TryParse value with
                    | true, value -> 
                        values.[cellRef] <- EvalResult.Success value
                        evaluate cellRef
                    | _ -> 
                        values.[cellRef] <- EvalResult.Error "Number expected"
                        [cellRef] :> _
            [| for r in affectedCells do 
                let rawValue = 
                    match rawValues.TryGetValue r with
                    | true, v -> v
                    | false, _ -> ""
    
                let valueStr, hasErr = 
                    match values.TryGetValue r with
                    | true, (EvalResult.Success v) -> (string v), false
                    | true, (EvalResult.Error msg) -> msg, true
                    | false, _ -> "", false
                let c = {Reference = r; Value = valueStr; RawValue = rawValue; HasError = hasErr}
                yield c |]
    

Nasıl Yapılır: F# Taşınabilir Kitaplığı Kullanan bir Silverlight Uygulaması Oluşturma

  1. Menü çubuğunda Dosya öğesini, Ekle öğesini ve ardından Yeni Proje öğesini seçin. Yeni Proje Ekle iletişim kutusunda, Visual C# öğesini genişletin, Silverlight öğesini genişletin ve ardından Silverlight Uygulamasını seçin. Yeni Silverlight Uygulaması iletişim kutusu görünür.

  2. Silverlight uygulamasını yeni bir Web sitesinde barındır onay kutusunu seçin, açılır kutuda da ASP.NET Web Uygulama Projesini seçin ve ardından Tamam düğmesine basın. İki proje oluşturuldu: bir projede Silverlight kontrolü, diğerinde ise kontrolü barındıran bir ASP.NET web uygulaması var.

  3. Çalışma Kitabı Projesine bir referans ekleyin. Silverlight Projesinin Referanslar düğümü için kısayol menüsünü açın ve Referans Ekle öğesini seçin. Referans Yöneticisi görüntülenir. Çözüm düğümünü genişletin, Çalışma Kitabı projesini seçin ve ardından Tamam düğmesini seçin.

  4. Bu adımda, UI'ın nasıl göründüğünü açıklamadan her şeyi anlattığı bir görüntü modeli oluşturursunuz. Proje düğümü için kısayol menüsünü açın, Ekle öğesini, ardından Yeni Öğe öğesini seçin. Bir kod dosyası ekleyin, adını ViewModel.cs olarak belirleyin ve ardından aşağıdaki kodu bu dosyanın içine yapıştırın:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Input;
    using Portable.Samples.Spreadsheet;
    
    namespace SilverlightFrontEnd
    {
        public class SpreadsheetViewModel
        {
            private Spreadsheet spreadsheet;
            private Dictionary<string, CellViewModel> cells = new Dictionary<string, CellViewModel>();
    
            public List<RowViewModel> Rows { get; private set; }
            public List<string> Headers { get; private set; }
    
    
            public string SourceCode
            {
                get
                {
                    return @"
    type Spreadsheet(height : int, width : int) = 
    
        do 
            if height <= 0 then failwith ""Height should be greater than zero""
            if width <= 0 || width > 26 then failwith ""Width should be greater than zero and lesser than 26""
    
        let rowNames = [| for i = 0 to height - 1 do yield string (i + 1)|]
        let colNames = [| for i = 0 to (width - 1) do yield string (char (int 'A' + i)) |]
    
        let isValidReference (s : string) = 
            if s.Length < 2 then false
            else
            let c = s.[0..0]
            let r = s.[1..]
            (Array.exists ((=)c) colNames) && (Array.exists ((=)r) rowNames)
    
        let dependencies = Dependencies.Graph()
        let formulas = Dictionary<_, Expression>()
    
        let values = Dictionary()
        let rawValues = Dictionary()
    
        let setError cell text = 
            values.[cell] <- EvalResult.E text
    
        let getValue reference = 
            match values.TryGetValue reference with
            | true, v -> v
            | _ -> EvalResult.S 0.0
    
        let deleteValue reference = 
            values.Remove(reference)
            |> ignore
    
        let deleteFormula cell = 
            match formulas.TryGetValue cell with
            | true, expr ->
                dependencies.Delete(cell, expr.GetReferences())
                formulas.Remove(cell) 
                |> ignore
            | _ -> ()
    ";
                }
            }
    
            public SpreadsheetViewModel(Spreadsheet spreadsheet)
            {
                this.spreadsheet = spreadsheet;
                Rows = new List<RowViewModel>();
                foreach (var rowRef in spreadsheet.GetRowReferences())
                {
                    var rowvm = new RowViewModel { Index = rowRef.Name, Cells = new List<CellViewModel>() };
    
                    foreach (var reference in rowRef.Cells)
                    {
                        var cell = new CellViewModel(this, reference);
                        cells.Add(reference, cell);
                        rowvm.Cells.Add(cell);
                    }
                    Rows.Add(rowvm);
    
                }
                Headers = new[] { "  " }.Concat(spreadsheet.Headers).ToList();
            }
    
            public void SetCellValue(string reference, string newText)
            {
                var affectedCells = spreadsheet.SetValue(reference, newText);
                foreach (var cell in affectedCells)
                {
                    var cellVm = cells[cell.Reference];
                    cellVm.RawValue = cell.RawValue;
    
                    if (cell.HasError)
                    {
                        cellVm.Value = "#ERROR";
                        cellVm.Tooltip = cell.Value; // will contain error
                    }
                    else
                    {
                        cellVm.Value = cell.Value;
                        cellVm.Tooltip = cell.RawValue;
                    }
                }
            }
        }
    
        public class RowViewModel
        {
            public string Index { get; set; }
            public List<CellViewModel> Cells { get; set; }
        }
    
        public class CellViewModel : INotifyPropertyChanged
        {
            private SpreadsheetViewModel spreadsheet;
    
            private string rawValue;
            private string value;
            private string reference;
            private string tooltip;
    
            public CellViewModel(SpreadsheetViewModel spreadsheet, string reference)
            {
                this.spreadsheet = spreadsheet;
                this.reference = reference;
            }
    
            public string RawValue
            {
                get
                {
                    return rawValue;
                }
                set
                {
                    var changed = rawValue != value;
                    rawValue = value;
                    if (changed) RaisePropertyChanged("RawValue");
                }
            }
            public string Value
            {
                get
                {
                    return value;
                }
                set
                {
                    var changed = this.value != value;
                    this.value = value;
                    if (changed) RaisePropertyChanged("Value");
                }
            }
            public string Tooltip
            {
                get
                {
                    return tooltip;
                }
                set
                {
                    var changed = this.tooltip != value;
                    this.tooltip = value;
                    if (changed)
                    {
                        RaisePropertyChanged("Tooltip");
                        RaisePropertyChanged("TooltipVisibility");
                    }
                }
            }
    
            public Visibility TooltipVisibility
            {
                get { return string.IsNullOrEmpty(tooltip) ? Visibility.Collapsed : Visibility.Visible; }
            }
    
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
    
            public void SetCellValue(string newValue)
            {
                spreadsheet.SetCellValue(reference, newValue);
            }
    
            private void RaisePropertyChanged(string name)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }
    
  5. Silverlight kontrol projesinde, ana çalışma kitabı için UI yerleşimini açıklayan MainPage.xaml dosyasını açın. MainPage.xaml dosyasında aşağıdaki XAML kodunu mevcut Kılavuz öğesine yapıştırın.

    <TextBlock Text="{Binding SourceCode}" FontSize="20" FontFamily="Consolas" Foreground="LightGray"/>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
          <StackPanel.Resources>
            <Style x:Key="CellBorder" TargetType="Border">
              <Setter Property="BorderThickness" Value="0.5"/>
              <Setter Property="BorderBrush" Value="LightGray"/>
            </Style>
            <Style x:Key="CaptionBorder" TargetType="Border" BasedOn="{StaticResource CellBorder}">
              <Setter Property="Background" Value="LightBlue"/>
            </Style>
            <Style x:Key="TextContainer" TargetType="TextBlock">
              <Setter Property="FontSize" Value="26"/>
              <Setter Property="FontFamily" Value="Segoe UI"/>
              <Setter Property="Width" Value="200"/>
              <Setter Property="Height" Value="60"/>
            </Style>
    
            <Style x:Key="CaptionText" TargetType="TextBlock" BasedOn="{StaticResource TextContainer}">
              <Setter Property="TextAlignment" Value="Center"/>
              <Setter Property="Foreground" Value="DimGray"/>
            </Style>
            <Style x:Key="ValueEditor" TargetType="TextBox">
              <Setter Property="Width" Value="200"/>
              <Setter Property="Height" Value="60"/>
              <Setter Property="FontSize" Value="26"/>
              <Setter Property="FontFamily" Value="Segoe UI"/>
    
            </Style>
            <Style x:Key="ValueText" TargetType="TextBlock" BasedOn="{StaticResource TextContainer}">
              <Setter Property="TextAlignment" Value="Center"/>
              <Setter Property="VerticalAlignment" Value="Center"/>
              <Setter Property="Foreground" Value="Black"/>
            </Style>
    
          </StackPanel.Resources>
          <Border Style="{StaticResource CellBorder}">
            <StackPanel>
    
              <ItemsControl ItemsSource="{Binding Headers}">
                <ItemsControl.ItemsPanel>
                  <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal" />
                  </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                  <DataTemplate>
                    <Border Style="{StaticResource CaptionBorder}">
                      <TextBlock Text="{Binding}" Style="{StaticResource CaptionText}"/>
                    </Border>
                  </DataTemplate>
                </ItemsControl.ItemTemplate>
              </ItemsControl>
    
              <ItemsControl ItemsSource="{Binding Rows}">
                <ItemsControl.ItemTemplate>
                  <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                      <Border Style="{StaticResource CaptionBorder}">
                        <TextBlock Text="{Binding Index}" Style="{StaticResource CaptionText}"/>
                      </Border>
                      <ItemsControl ItemsSource="{Binding Cells}">
                        <ItemsControl.ItemsPanel>
                          <ItemsPanelTemplate>
                            <VirtualizingStackPanel  Orientation="Horizontal"/>
                          </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                          <DataTemplate>
                            <Border Style="{StaticResource CellBorder}">
                              <Grid>
                                <TextBox
                                  Name="editor"
                                  Tag="{Binding ElementName=textContainer}"
                                  Visibility="Collapsed"
                                  LostFocus="OnLostFocus"
                                  KeyUp="OnKeyUp"
                                  Text ="{Binding RawValue}"
                                  Style="{StaticResource ValueEditor}"/>
                                <TextBlock
                                  Name="textContainer"
                                  Tag="{Binding ElementName=editor}"
                                  Visibility="Visible"
                                  Text="{Binding Value}"
                                  Style="{StaticResource ValueText}"
                                  MouseLeftButtonDown="OnMouseLeftButtonDown"
                                  ToolTipService.Placement="Mouse">
                                  <ToolTipService.ToolTip>
                                    <ToolTip Visibility="{Binding TooltipVisibility}">
                                      <TextBlock Text="{Binding Tooltip}" Style="{StaticResource TextContainer}" Visibility="{Binding TooltipVisibility}"/>
                                    </ToolTip>
                                  </ToolTipService.ToolTip>
                                </TextBlock>
                              </Grid>
                            </Border>
                          </DataTemplate>
                        </ItemsControl.ItemTemplate>
                      </ItemsControl>
                    </StackPanel>
                  </DataTemplate>
                </ItemsControl.ItemTemplate>
              </ItemsControl>
    
            </StackPanel>
          </Border>
        </StackPanel>
    
  6. MainPage.xaml.cs dosyasında using SilverlightFrontEnd; öğesini kullanım direktifleri listesine ekleyin ve ardından aşağıdaki yöntemleri SilverlightApplication1 sınıfına ekleyin.

            void OnLostFocus(object sender, RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var text = editor.Text;
    
                HideEditor(e);
    
                EditValue(editor.DataContext, text);
            }
    
            void OnKeyUp(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Escape)
                {
                    HideEditor(e);
                    e.Handled = true;
                    return;
                }
                else if (e.Key == Key.Enter)
                {
                    var editor = (TextBox)e.OriginalSource;
                    var text = editor.Text;
    
                    HideEditor(e);
    
                    EditValue(editor.DataContext, text);
                    e.Handled = true;
                }
            }
    
            private void EditValue(object dataContext, string newText)
            {
                var cvm = (CellViewModel)dataContext;
                cvm.SetCellValue(newText);
            }
    
            private void OnMouseLeftButtonDown(object sender, RoutedEventArgs e)
            {
                var textBlock = (TextBlock)e.OriginalSource;
                var editor = (TextBox)textBlock.Tag;
                textBlock.Visibility = Visibility.Collapsed;
                editor.Visibility = Visibility.Visible;
                editor.Focus();
            }
    
            private void HideEditor(RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var textBlock = (TextBlock)editor.Tag;
                editor.Visibility = Visibility.Collapsed;
                textBlock.Visibility = Visibility.Visible;
            }
    
  7. App.xaml.cs dosyasında, aşağıdaki kullanım direktiflerini dosyaya ekleyin:

    using SilverlightFrontEnd;
    using Portable.Samples.Spreadsheet;
    

    Aşağıdaki kodu Application_Startup olay işleyicisine yapıştırın:

                var spreadsheet = new Spreadsheet(5, 5);
                var spreadsheetViewModel = new SpreadsheetViewModel(spreadsheet);
                var main = new MainPage();
                main.DataContext = spreadsheetViewModel;
                this.RootVisual = main;
    
  8. Silverlight ön ucunuzu doğrudan Silverlight projesini başlatarak ya da Silverlight kontrolünü barındıran ASP.NET web uygulamasını başlatarak sınayabilirsiniz. Bu projelerden birinin düğümü için kısayol menüsünü açın ve Başlangıç Projesi Olarak Ayarla öğesini seçin.

Nasıl Yapılır: F# Taşınabilir Kitaplığı Kullanan bir Windows Mağazası Uygulaması Oluşturma

  1. Bu bölümde, hesap bileşeni olarak F# çalışma kitabı kullanan bir Windows Mağazası uygulaması oluşturursunuz. Menü çubuğunda, Dosya, Ekle, Yeni Proje seçeneğini belirleyin. Yeni Proje iletişim kutusu görüntülenir. Yüklü bölümü altında, Visual C#öğesini genişletin, Windows Store öğesini genişletin ve ardından Boş Uygulama şablonunu seçin. Proje adını NewFrontEnd olarak belirleyin ve ardındanTamam düğmesini seçin. Windows Mağazası uygulaması oluşturmak için geliştirici lisansınız istenirse, bilgilerinizi girin. Bilgileriniz yoksa, nasıl ayarlayacağınızı buradan.

    Proje oluşturulur. Bu projenin yapılandırmasını ve bileşenlerini not edin. Varsayılan Referanslar Windows Mağaza için .NET uygulamalarını içerir, bunlar .NET Framework'ün Windows Mağazası uygulamalarıyla ve Windows derleme ile uyumlu alt kümeleridir ve Windows Çalışma Zamanı için API'ları ve Windows Mağazası uygulamaları için UI'ları içerirler. Varlıklar ve Ortak alt klasörler oluşturuldu. Varlık alt klasörü Windows Mağazası uygulamalarında geçerli olan birkaç simge içerir ve Ortak alt klasör Windows Mağazası uygulamalarının kullanımı için şablon oluşturan paylaşılan rutinleri içerir. Varsayılan proje şablonu aynı zamanda App.xaml, BlankPage.xaml ve ilgili C# kod arkası dosyaları olan App.xaml.cs ve BlankPage.xaml.cs dosyalarını oluşturmuştur. App.xaml uygulamanın genelini açıklar, BlankPage.xaml ise tanımlanmış bir UI yüzeyini açıklar. Son olarak, .pfx dosyaları ve .appxmanifest dosyaları Windows Mağazası uygulamaları için güvenlik ve dağıtım modellerini destekler.

  2. Silverlight projesinin Referanslar düğümü için kısayol menüsünü açıp Referans Ekle öğesini seçerek Çalışma Kitabı projesine bir referans ekleyin. Referans Yöneticisinde, Çözüm düğümünü genişletin, Çalışma Kitabı projesini seçin ve ardından Tamam düğmesini seçin.

  3. Windows Mağazası uygulamasının UI kodunu desteklemesi için Silverlight projesinde zaten kullanılmış olan kodun birazına ihtiyacınız olur. Bu kod ViewModels.cs dosyasındadır. NewFrontEnd proje düğümü için kısayol menüsünü açın, Ekle öğesini, ardından Yeni Öğe öğesini seçin. bir C# kod dosyası ekleyin ve ViewModel.cs olarak adlandırın. ViewModels.cs dosyasındaki kodu Silverlight projesine yapıştırın ve bu dosyanın en üstündeki kullanım direktifleri bloğunu değiştirin. Silverlight UI için kullanılan System.Windows öğesini kaldırın ve Windows Mağazası uygulaması UI için kullanılan Windows.UI.Xaml ve Windows.Foundation.Collections öğelerini ekleyin. Silverlight ve Windows Mağazası WPF tabanlıdır, bu yüzden birbirleriyle uyumludurlar. Kullanım direktiflerinin güncellenen bloğu aşağıdaki örneğe benzemelidir:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using Portable.Samples.Spreadsheet;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    

    Ayrıca, ViewModels.cs dosyasındaki ad alanını SilverlightFrontEnd'den NewFrontEnd'e değiştirin.

    Kodun geri kalanını ViewModels.cs dosyasında yeniden kullanabilirsiniz, ancak Görülebilirlik gibi bazı türler artık Silverlight yerine Windows Mağazası uygulamalarının sürümleridir.

  4. Bu Windows Mağazası uygulamasında, App.xaml.cs kodu Silverlight uygulamasının Application_Startup olay işleyicisinde görüntülenen başlangıç koduyla benzer başlangıca sahip olmalıdır. Bir Windows Mağazası uygulamasında, bu kod Uygulama sınıfının OnLaunched olay işleyicisinde görünür. Aşağıdaki kodu App.xaml.cs dosyasında OnLaunched olay işleyicisine ekleyin:

    var spreadsheet = new Spreadsheet(5, 5);
    var spreadsheetViewModel = new SpreadSheetViewModel(spreadsheet);
    
  5. Çalışma Kitabı kodu için bir kullanım direktifi ekleyin.

    using Portable.Samples.Spreadsheet;
    
  6. App.xaml.cs dosyasında OnLaunched hangi sayfanın yükleneceğini belirleyen kodu içerir. Kullanıcı uygulamayı başlattığında açılmasını istediğiniz sayfayı eklersiniz. OnLaunched içerisindeki kodu aşağıdaki örnekte gösterildiği gibi ilk sayfaya gidecek şekilde değiştirin:

    // Create a frame, and navigate to the first page.
    var rootFrame = new Frame();
    rootFrame.Navigate(typeof(ItemsPage1), spreadsheetViewModel);
    

    BlankPage.1.xaml ve kod arkası dosyasını silebilirsiniz, çünkü bunlar bu örnekte kullanılmamaktadır.

  7. NewFrontEnd proje düğümü için kısayol menüsünü açın, Ekle öğesini, ardından Yeni Öğe öğesini seçin. Bir Öğe Sayfası ekleyin ve varsayılan ismini ItemsPage1.xaml olarak belirleyin. Bu adım ItemsPage1.xaml ve kod arkası dosyası ItemsPage1.xaml.cs dosyasını projeye ekler. ItemsPage1.xaml aşağıdaki XAML kodunda gösterildiği gibi birçok nitelikle common:LayoutAwarePage öğesinin ana etiketi ile başlar:

    <common:LayoutAwarePage
        x:Name="pageRoot"
        x:Class="NewFrontEnd.ItemsPage1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:NewFrontEnd"
        xmlns:common="using:NewFrontEnd.Common"
        xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    

    Windows Mağazası uygulamasının UI kodu oluşturduğunuz Silverlight uygulamasının UI kodu ile aynıdır ve bu durumda XAML biçimi de aynıdır. Bu nedenle, MainPage.xaml dosyasındaki XAML'i Windows Mağazası uygulamasında ItemsPage1.xaml UI için Silverlight projesinde yeniden kullanabilirsiniz.

  8. Kodu en üst düzey MainPage.xaml Kılavuz öğesi içerisinde kopyalayın ve Windows Mağazası uygulamasında UI projesinde ItemsPage1.xaml dosyasındaki en üst düzey Kılavuz öğesine yapıştırın. Kodu yapıştırdığınızda, Kılavuz öğesinin var olan bileşenlerinin üzerine yazabilirsiniz. Kılavuz öğesindeki Arka Plan niteliğini "Beyaz" olarak değiştirin ve MouseLeftButtonDown yerine PointerPressed yerleştirin.

    Bu olayın ismi Silverlight uygulamalarında ve Windows Mağazası uygulamalarında değişiklik gösterir.

  9. ItemsPage.xaml.cs dosyasında DataContext özelliğini OnNavigatedTo yöntemini değiştirerek ayarlayın.

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.DataContext = e.Parameter;
    }
    
  10. Aşağıdaki olay işleyici kodunu kopyalayın ve ItemsPage1 sınıfına yapıştırın:OnLostFocus, OnKeyUp, EditValue, OnPointerPressed ve HideEditor.

    void OnLostFocus(object sender, RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var text = editor.Text;
    
                HideEditor(e);
    
                EditValue(editor.DataContext, text);
            }
    
            void OnKeyUp(object sender, KeyEventArgs e)
            {
                if (e.Key == Windows.System.VirtualKey.Escape)
                {
                    HideEditor(e);
                    e.Handled = true;
                    return;
                }
                else if (e.Key == Windows.System.VirtualKey.Enter)
                {
                    var editor = (TextBox)e.OriginalSource;
                    var text = editor.Text;
    
                    HideEditor(e);
    
                    EditValue(editor.DataContext, text);
                    e.Handled = true;
                }            
            }
    
            private void EditValue(object dataContext, string newText)
            {
                var cvm = (CellViewModel)dataContext;
                cvm.SetCellValue(newText);
            }
    
            private void OnPointerPressed(object sender, RoutedEventArgs e)
            {
                var textBlock = (TextBlock)e.OriginalSource;
                var editor = (TextBox)textBlock.Tag;
                textBlock.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                editor.Visibility = Windows.UI.Xaml.Visibility.Visible;
    
                editor.Focus(FocusState.Programmatic);
            }
    
            private void HideEditor(RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var textBlock = (TextBlock)editor.Tag;
                editor.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                textBlock.Visibility = Windows.UI.Xaml.Visibility.Visible;
            }
    
  11. Başlangıç projesini Windows Mağazası uygulamanızın projesi olarak değiştirin. NewFrontEnd proje düğümü için kısayol menüsünü açın, Başlangıç Projesi Olarak Ayarla öğesini seçin ve projeyi çalıştırmak için F5 tuşuna basın.

F# Kullanan bir C# Üzerinde Taşınabilir Kitaplık Oluşturma

Bir önceki örnek birden fazla projede görünen ViewModels.cs kodunun göründüğü kodu kopyalar. Bu bölümde, bu kodu içermek için bir C# Taşınabilir Kitaplığı oluşturursunuz. Bazı durumlarda, F# kullanan taşınabilir kitaplıkları tükettiğinde uygulamanın yapılandırma dosyasına bilgi eklemeniz gerekir. Bu durumda, .NET Framework 4.5'in bir masaüstü sürümünü hedefleyen bir masaüstü uygulaması karşılığında bir F# taşınabilir kitaplığını referans gösteren bir C# taşınabilir kitaplığını referans gösterir. Böyle bir durumda, ana uygulamanın app.config dosyasına bağlı bir yönlendirme eklemelisiniz. Bu yönlendirmeyi eklemeniz gerekir çünkü FSharp.Core kitaplığının yalnızca bir sürümü yüklenmiştir, ancak taşınabilir kitaplıklar .NET taşınabilir sürümünü referans gösterir. FSharp.Core işlevlerinin .NET Taşınabilir sürümlerine yapılan çağrılar masaüstü uygulamasında yüklü olan FSharp.Core'un tek sürümüne yönlendirilmiş olmalıdır. Bağlı yönlendirmeler yalnızca masaüstü uygulamasında gereklidir çünkü Silverlight 5 ve Windows Mağazası uygulamalarının çalışma zamanı ortamları FSharp.Core'un tam masaüstü sürümünü değil, .NET Taşınabilir sürümünü kullanır.

Nasıl Yapılır: F# Kullanan bir Taşınabilir Kitaplığı Referans Gösteren Masaüstü Uygulaması Oluşturma

  1. Menü çubuğunda, Dosya, Ekle, Yeni Proje seçeneğini belirleyin. Yüklü öğesi altında, Visual C# düğümünü genişletin, .NET Taşınabilir Kitaplığı proje şablonunu seçin ve ardından projeyi ViewModels olarak adlandırın.

  2. Bu .NET Taşınabilir kitaplığı hedeflerini referans ekleyeceğiniz F# Taşınabilir Kitaplığı ile uyuşacak şekilde ayarlamalısınız. Aksi takdirde, bir hata mesajı size uyuşmazlık hakkında bilgi verir. ViewModels projesi için kısayol menüsünde, Özellikler öğesini seçin. Kitaplık sekmesinde, bu taşınabilir kitaplığın hedeflerini .NET Framework 4.5, Silverlight 5 veWindows Mağazası uygulamaları ile uyuşacak şekilde değiştirin.

  3. Referanslar düğümü için kısayol menüsünde, Referans Ekle öğesini seçin. Çözüm öğesi altında, Çalışma Kitabının yanındaki onay kutusunu seçin.

  4. Diğer projelerden birinden ViewModels.cs dosyasındaki kodu kopyalayın ve ViewModels projesinin kod dosyasına yapıştırın.

  5. Aşağıdaki değişiklikleri yapın, böylelikle ViewModels içindeki kodu UI platformundan tamamen bağımsız hale getirirsiniz:

    1. System.Windows, System.Windows.Input, Windows.Foundation.Collections ve Windows.UI.Xaml için kullanım direktiflerini kaldırın.

    2. Ad alanını ViewModels olarak değiştirin.

    3. TooltipVisibility özelliğini kaldırın. Bu özellik platformdan bağımsız bir nesne olan Görünebilirliği kullanır.

  6. Menü çubuğunda, Dosya, Ekle, Yeni Proje seçeneğini belirleyin. Yüklü bölümü altında, **Visual C#**düğümünü genişletin ve ardından WPF Uygulaması proje şablonunu seçin. Yeni projenin adını Masaüstü olarak belirleyin ve Tamam düğmesini seçin.

  7. Masaüstü projesindeki Referanslar düğümü için kısayol menüsünü açın ve Referans Ekle öğesini seçin. Çözüm öğesi altında, Çalışma Kitabını ve ViewModels projelerini seçin.

  8. WPF uygulaması için app.config dosyasını açın ve aşağıdaki kod satırlarını ekleyin. Bu kod .NET Framework 4.5'i hedefleyen bir masaüstü uygulaması F# kullanan bir .NET Taşınabilir Kitaplığını referans gösterdiğinde geçerli olan uygun bağlama yönlendirmelerini yapılandırır. .NET Taşınabilir kitaplıkları FSharp.Core kitaplığının 2.3.5.0 sürümünü kullanır, .NET Framework 4.5 masaüstü uygulamaları 4.3.0.0 sürümünü kullanır.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
                    <bindingRedirect oldVersion="2.3.5.0" newVersion="4.3.0.0"/>
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
    </configuration>
    

    Şimdi F# Core Kitaplığının taşınabilir sürümüne bir referans eklemelisiniz. F# taşınabilir kitaplığını referans gösteren bir taşınabilir kitaplık kullanan bir uygulamanız olduğunda bu referans gereklidir.

  9. Masaüstü projesindeki Referanslar düğümü için kısayol menüsünü açın ve Referans Ekle öğesini seçin. Gözat öğesini seçin ve Visual Studio'nun yüklü olduğu Program Dosyaları klasöründe Referans Derlemeleri\Microsoft\FSharp\3.0\Çalışma Zamanı\.NETPortable\FSharp.Core.dll öğesine gidin.

  10. Masaüstü projesinde, ViewModels.cs ve Portable.Samples.Spreadsheet kullanım direktiflerini App.xaml.cs ve MainWindow.xaml.cs öğelerine ekleyin.

    using ViewModels;
    using Portable.Samples.Spreadsheet;
    
  11. MainWindow.xaml dosyasını açın ve Window sınıfının başlık niteliğini Çalışma Kitabı olarak değiştirin.

  12. Kodu Silverlight projesinde MainPage.xaml Kılavuz öğesi içerisinde kopyalayın ve bu kodu Masaüstü projesinde MainWindow.xaml dosyasının Kılavuz öğesine yapıştırın.

  13. Kodu Silverlight projesinde MainPage.xaml Kılavuz öğesi içerisinde kopyalayın ve bu kodu Masaüstü projesinde MainWindow.xaml dosyasının Kılavuz öğesine yapıştırın.

            void OnLostFocus(object sender, RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var text = editor.Text;
    
                HideEditor(e);
    
                EditValue(editor.DataContext, text);
            }
    
            void OnKeyUp(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Escape)
                {
                    HideEditor(e);
                    e.Handled = true;
                    return;
                }
                else if (e.Key == Key.Enter)
                {
                    var editor = (TextBox)e.OriginalSource;
                    var text = editor.Text;
    
                    HideEditor(e);
    
                    EditValue(editor.DataContext, text);
                    e.Handled = true;
                }
            }
    
            private void EditValue(object dataContext, string newText)
            {
                var cvm = (CellViewModel)dataContext;
                cvm.SetCellValue(newText);
            }
    
            private void OnMouseLeftButtonDown(object sender, RoutedEventArgs e)
            {
                var textBlock = (TextBlock)e.OriginalSource;
                var editor = (TextBox)textBlock.Tag;
                textBlock.Visibility = Visibility.Collapsed;
                editor.Visibility = Visibility.Visible;
                editor.Focus();
            }
    
            private void HideEditor(RoutedEventArgs e)
            {
                var editor = (TextBox)e.OriginalSource;
                var textBlock = (TextBlock)editor.Tag;
                editor.Visibility = Visibility.Collapsed;
                textBlock.Visibility = Visibility.Visible;
            }
    
  14. Çalışma kitabı başlangıç kodunu MainWindow.xaml.cs içinde MainWindow oluşturucuya ekleyin ve MainPage referanslarını MainWindow referansları ile değiştirin.

        public MainWindow()
        {
                var spreadsheet = new Spreadsheet(5, 5);
                var spreadsheetViewModel = new SpreadsheetViewModel(spreadsheet);
    
    
                this.DataContext = spreadsheetViewModel;
                InitializeComponent();
        }
    
  15. Masaüstü projesi için kısayol menüsünü açın ve Başlangıç Projesi Olarak Ayarla öğesini seçin.

  16. Uygulamayı oluşturmak için F5 tuşunu seçin ve hata ayıklayın.

Sonraki Adımlar

Alternatif olarak, Windows Mağazası uygulaması ve Silverlight uygulaması için projeleri değiştirebilirsiniz ve böylece yeni ViewModels taşınabilir kitaplığını kullanabilirsiniz.

Windows Geliştirici Merkezi üzerinde Windows Mağazası uygulamaları hakkında daha fazla bilgi edinin.

Ayrıca bkz.

Kavramlar

Windows Mağazası Uygulamaları

.NET Framework ile Platformlar Arası Geliştirme

Diğer Kaynaklar

Görsel F# örnekleri ve izlenecek yollar

Silverlight