private async Task ReadMobileStyle(string stylePath) { try { // Open the mobile style file at the provided path. _emojiStyle = await SymbolStyle.OpenAsync(stylePath); // Get the default style search parameters. SymbolStyleSearchParameters searchParams = await _emojiStyle.GetDefaultSearchParametersAsync(); // Search the style with the default parameters to return all symbol results. IList <SymbolStyleSearchResult> styleResults = await _emojiStyle.SearchSymbolsAsync(searchParams); // Create lists to contain the available symbol layers for each category of symbol and add an empty entry as default. List <SymbolLayerInfo> eyeSymbolInfos = new List <SymbolLayerInfo> { new SymbolLayerInfo("", null, "") }; List <SymbolLayerInfo> mouthSymbolInfos = new List <SymbolLayerInfo> { new SymbolLayerInfo("", null, "") }; List <SymbolLayerInfo> hatSymbolInfos = new List <SymbolLayerInfo>() { new SymbolLayerInfo("", null, "") }; // Loop through the results and put symbols into the appropriate list according to category. foreach (SymbolStyleSearchResult result in styleResults) { // Get the symbol for this result. MultilayerPointSymbol multiLayerSym = result.Symbol as MultilayerPointSymbol; // Create a swatch image from the symbol. RuntimeImage swatch = await multiLayerSym.CreateSwatchAsync(30, 30, 96, Color.White); // Create an image source from the swatch. Stream imageBuffer = await swatch.GetEncodedBufferAsync(); byte[] imageData = new byte[imageBuffer.Length]; imageBuffer.Read(imageData, 0, imageData.Length); ImageSource symbolImage = ImageSource.FromStream(() => new MemoryStream(imageData)); // Create a symbol layer info object to represent the symbol in the list. // The symbol key will be used to retrieve the symbol from the style. SymbolLayerInfo symbolInfo = new SymbolLayerInfo(result.Name, symbolImage, result.Key); // Add the symbol layer info to the correct list for its category. switch (result.Category) { case "Eyes": { eyeSymbolInfos.Add(symbolInfo); break; } case "Mouth": { mouthSymbolInfos.Add(symbolInfo); break; } case "Hat": { hatSymbolInfos.Add(symbolInfo); break; } } } // Show the symbols in the category list boxes. EyesListView.ItemsSource = eyeSymbolInfos; MouthListView.ItemsSource = mouthSymbolInfos; HatListView.ItemsSource = hatSymbolInfos; // Call a function to construct the current symbol (default yellow circle). Symbol faceSymbol = await GetCurrentSymbol(); // Call a function to show a preview image of the symbol. await UpdateSymbolPreview(faceSymbol); } catch (Exception ex) { // Report the exception. await DisplayAlert("Error reading style", ex.Message, "OK"); } }
private async Task <MultilayerPointSymbol> GetCurrentSymbol() { // If the style hasn't been opened, return. if (_emojiStyle == null) { return(null); } MultilayerPointSymbol faceSymbol = null; try { // Get the key that identifies the selected eye symbol (or an empty string if none selected). SymbolLayerInfo eyeLayerInfo = (SymbolLayerInfo)EyesListView.SelectedItem; string eyeLayerKey = eyeLayerInfo != null ? eyeLayerInfo.Key : string.Empty; // Get the key that identifies the selected mouth symbol (or an empty string if none selected). SymbolLayerInfo mouthLayerInfo = (SymbolLayerInfo)MouthListView.SelectedItem; string mouthLayerKey = mouthLayerInfo != null ? mouthLayerInfo.Key : string.Empty; // Get the key that identifies the selected hat symbol (or an empty string if none selected). SymbolLayerInfo hatLayerInfo = (SymbolLayerInfo)HatListView.SelectedItem; string hatLayerKey = hatLayerInfo != null ? hatLayerInfo.Key : string.Empty; // Create a list of the symbol keys that identify the selected symbol layers, including the base (circle) symbol. List <string> symbolKeys = new List <string> { _baseSymbolKey, eyeLayerKey, mouthLayerKey, hatLayerKey }; // Get a multilayer point symbol from the style that contains the selected symbol layers. faceSymbol = await _emojiStyle.GetSymbolAsync(symbolKeys) as MultilayerPointSymbol; // Loop through all symbol layers and lock the color. foreach (SymbolLayer lyr in faceSymbol.SymbolLayers) { // Changing the color of the symbol will not affect this layer. lyr.IsColorLocked = true; } // Unlock the color for the base (first) layer. Changing the symbol color will change this layer's color. faceSymbol.SymbolLayers.First().IsColorLocked = false; // Set the symbol color from the combo box. if (ColorListView.SelectedItem != null) { faceSymbol.Color = (Color)ColorListView.SelectedItem; } // Set the symbol size from the slider. faceSymbol.Size = SizeSlider.Value; } catch (Exception ex) { // Report the exception. await DisplayAlert("Error creating symbol", ex.Message, "OK"); } // Return the multilayer point symbol. return(faceSymbol); }