Код с учетом местоположения преобразован из C # в F #? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть следующий код в приложении WP7, и я начинаю смотреть на F #. Я не могу найти примеры GeoCoordinate, кто-нибудь может дать мне представление о том, как этот код будет выглядеть в F #? Или указать мне на пример? Я взглянул на некоторые учебные пособия, книги и Pluralsight, так что, думаю, я только начинаю понимать основы ... но, кажется, не могу понять это! Все примеры, которые я могу найти, основаны на математических проблемных пространствах. Любая помощь или совет высоко ценится!

public partial class MainPage : PhoneApplicationPage
{
    GeoCoordinateWatcher watcher;
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
    }

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        //Reinitialize the GeoCoordinateWatcher
        watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
        watcher.MovementThreshold = 100;//distance in meters

        //Add event handlers for StatusChanged and PositionChanged Events
        watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
        watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);

        //Start data acquisition
        watcher.Start();

        //hide button
        btnStart.Visibility = Visibility.Collapsed;


    }

    #region Event Handlers
    /// <summary>
    /// Handler for the StatusChanged event. This invokes MyStatusChanged on the UI thread
    /// and passes the GeoPositionStatusChangedEventArgs
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        Deployment.Current.Dispatcher.BeginInvoke(() => MyStatusChanged(e));
    }
    /// <summary>
    /// Handler for the PositionChanged Event. This invokes MyPositionChanged on the UI thread and 
    /// passes the GeoPositionStatusChangedEventArgs
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        Deployment.Current.Dispatcher.BeginInvoke(() => MyPositionChanged(e));
    }
    #endregion

    /// <summary>
    /// Custom method called from the PositionChanged event handler
    /// </summary>
    /// <param name="e"></param>
    /// <returns></returns>
    void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        //update the map to show the current location
        GeoCoordinate geo = new GeoCoordinate(e.Position.Location.Latitude, e.Position.Location.Longitude);
        Location ppLoc = new Location(e.Position.Location.Latitude, e.Position.Location.Longitude);
        mapMain.SetView(geo, 10);
        //update pushpin location and show
        MapLayer.SetPosition(ppLocation, ppLoc);
        ppLocation.Visibility = System.Windows.Visibility.Visible;
    }
    /// <summary>
    /// Custom method called from the StatusChanged event handler
    /// </summary>
    /// <param name="e"></param>
    /// <returns></returns>
    void MyStatusChanged(GeoPositionStatusChangedEventArgs e)
    {
        switch (e.Status)
        {
            case GeoPositionStatus.Disabled:
                //the location service is disabled or unsupported, alert the user
                tbStatus.Text = "Sorry we can't find you on this device";
                break;
            case GeoPositionStatus.Initializing:
                //location service is initializing
                //disable the start location button
                tbStatus.Text = "Looking For you...";
                break;
            case GeoPositionStatus.NoData:
                //location service is working but no data found, alert the user and enable the stop location button
                tbStatus.Text = "can't find you yet...";
                ResetMap();
                break;
            case GeoPositionStatus.Ready:
                //location service is receiving data, show the current position and enable the stop location button
                tbStatus.Text = "We found you!";
                break;
        }

    }

    void ResetMap()
    {
        Location ppLoc = new Location(0, 0);
        GeoCoordinate goe = new GeoCoordinate(0.0,0.0);
        mapMain.SetView(goe, 1);

        //update pushpin location and show
        MapLayer.SetPosition(ppLocation, ppLoc);
        ppLocation.Visibility = System.Windows.Visibility.Collapsed;
    }
}

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я думаю, что это связано с тем, что F # рекламируется как язык, который позволяет обрабатывать большое количество информации, не будучи очень многословным. Хотя вы можете создавать небольшие элементы пользовательского интерфейса, используя F #, вызывая соответствующие библиотеки, вы намерены создавать пользовательские интерфейсы с использованием C # / ASP.NET/ и т. Д. Таким образом, это не будет иметь смысла для вашего приложения, потому что все, что вы делаете, это создание небольшого пользовательского интерфейса и связывание событий этого пользовательского интерфейса с большой библиотекой возможностей геообработки.

Но если вы хотите собрать из этой библиотеки (или подобной) информацию обо всех близлежащих точках интереса, то сортируйте их в соответствии с расстоянием от пользователя и его потенциалом для "симпатии" этой точки интереса на основе некоторого алгоритм, разработанный для сравнения случайной точки интереса с категориями или предыдущими рейтингами, тогда F # будет хорошим выбором. Вы можете быстро описать эти структуры данных, манипулировать ими и вернуть результат их обработки обратно в пользовательский интерфейс.

Именно поэтому инструкции , например, показанные здесь , могут быть полезны. Несмотря на легкость вызова или создания пользовательского интерфейса (код C # просто отображает некоторый текст, переданный из кода F #), его можно использовать для создания серверной части для вашего телефонного приложения.

0 голосов
/ 20 марта 2012

Пример, который вы опубликовали, содержит много кода, поэтому я не ожидаю, что кто-нибудь переведет это на F # для вас.Вызов функциональности .NET из F # обычно очень похож на вызов из C # (по крайней мере, на начальном этапе, прежде чем вы научитесь использовать некоторые расширенные шаблоны F #), поэтому перевод должен быть довольно прямым.

Версия кода F #, которая инициализирует GeoCoordinateWatcher, вероятно, будет выглядеть следующим образом:

let watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High)
watcher.MovementThreshold <- 100

// Add event handlers for StatusChanged and PositionChanged Events 
watcher.StatusChanged.Add(fun eargs ->
  MyStatusChanged(eargs) )
watcher.PositionChanged.Add(fun eargs ->
  MyPositionChanged(eargs) ) 

// Start data acquisition 
watcher.Start()

В общем, F # имеет несколько приятных функций, которые упрощают программирование пользовательского интерфейса.Насколько я знаю, руководства по разработке приложений для Windows Phone на F # нет, в частности, но в MSDN есть раздел, в котором описывается разработка приложений Silverlight, и большинство шаблонов будут одинаковыми:

...