Может ли функция Convert.ToChar() получить параметр int больше 65535

Я пытаюсь получить все символы Segoe UI Symbol Font.

Я получил их, преобразовал в char, преобразовал в шестнадцатеричное значение и добавил в список как элементы.

Таким образом, кто-то другой может использовать свои шестнадцатеричные значения для проектов XAML в качестве значка.

Но проблема в коде: я всегда получаю OverFlowException в функции Convert.ToChar.

Код работает правильно, но когда переменная индекса больше 65535, что является максимальным значением char, я получаю исключение переполнения.

Но если вы запустите код, как вы увидите, в семействе шрифтов Segoe UI Symbol больше символов, чем 65535.

Может быть, мой метод неверен, вы можете посоветовать мне другой метод.

Файл MainWindow.xaml:

<Grid Loaded="Grid_Loaded">
    <ListView x:Name="listview">
        <ListView.View>
            <GridView> 
                <GridViewColumn Header="HexValue"  />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

Файл MainWindow.xaml.vb

Class MainWindow

    Public glyph As GlyphTypeface
    Dim characterMap As IDictionary(Of Integer, UShort)

    Private Sub Grid_Loaded(sender As Object, e As RoutedEventArgs)
        SymbolleriGetir()
    End Sub

    Public Sub SymbolleriGetir()
        Dim segoeUiSymbol As FontFamily
        For Each font As FontFamily In Fonts.SystemFontFamilies
            Dim fontName As String
            fontName = font.Source
            If fontName = "Segoe UI Symbol" Then
                segoeUiSymbol = font
            End If
        Next

        For Each typeFace As Typeface In segoeUiSymbol.GetTypefaces
            typeFace.TryGetGlyphTypeface(glyph)
            If glyph IsNot Nothing Then
                characterMap = glyph.CharacterToGlyphMap
            Else
                Continue For
            End If
        Next

        For i As Integer = 0 To characterMap.Keys.Count
            Dim index As Integer = characterMap.Keys.ElementAt(i)
            Dim c As Char = Nothing
            c = Convert.ToChar(index)
            Dim charText As String = c.ToString()
            listview.Items.Add(String.Format("&#x{0:x2};", System.Convert.ToUInt32(c)))
        Next

    End Sub
End Class

person AndroCoder    schedule 14.02.2014    source источник
comment
как вы хотите представить символы семейства шрифтов? OverflowException будет повышен, если значение меньше Char.MinValue или больше Char.MaxValue.   -  person NoviceProgrammer    schedule 14.02.2014
comment
В настраиваемых элементах списка и текстовых блоков. Нравится ‹TextBlock Text= FontFamily=Segoe UI Symbol FontSize=60 /›   -  person AndroCoder    schedule 14.02.2014


Ответы (1)


CharacterToGlyphMap — это карта поиска (IDictionary (Of Integer, UShort)) с UShort, являющимся символом Юникода, поэтому нет необходимости преобразовывать.

Я не разработчик VB, но я только что закодировал это и протестировал, который перечисляет символы и создает глиф изображения рядом с каждым шестнадцатеричным значением:

введите здесь описание изображения

Крылья:

введите здесь описание изображения

Ваш загруженный обработчик событий: (я вышел после 100 из-за времени загрузки)

    Private Sub Grid_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim glyph As GlyphTypeface
        Dim glyphIndex As UShort
        Dim typeface As System.Windows.Media.Typeface = New System.Windows.Media.Typeface("Segoe UI Symbol")
        If (typeface.TryGetGlyphTypeface(glyph)) Then
            Dim glyphLookupMap As IDictionary(Of Integer, UShort) = glyph.CharacterToGlyphMap
            Dim x As Integer = 0
            For Each kvp As KeyValuePair(Of Integer, UShort) In glyphLookupMap
                Dim c As Char = Convert.ToChar(kvp.Value)
                Dim glyphImage As ImageSource = Nothing
                If (glyphLookupMap.TryGetValue(kvp.Key, glyphIndex)) Then
                    glyphImage = Me.CreateGlyph(glyph, glyphIndex, kvp.Value, Brushes.Blue)
                End If
                Me._listview.Items.Add(Me.CreateGlyphListboxEntry(kvp.Key, glyphImage))
                Dim num As Integer = x + 1
                x = num
                If (num > 100) Then
                    Exit For
                End If
            Next
        End If
    End Sub

А вот и создатель изображения Glyph

    Private Function CreateGlyph(ByVal glyphTypeface As System.Windows.Media.GlyphTypeface, ByVal glyphIndex As UShort, ByVal charUShortVal As UShort, ByVal foreground As Brush) As System.Windows.Media.ImageSource
        Dim imageSource As System.Windows.Media.ImageSource
        Dim flag As Boolean = False
        Dim drawingImage As System.Windows.Media.DrawingImage = Nothing
        Try
            Dim glyphIndexes As IList(Of UShort) = New List(Of UShort)() From
            {
                charUShortVal 
            }
            Dim advanceWidths As IList(Of Double) = New List(Of Double)() From
            {
                glyphTypeface.AdvanceWidths(glyphIndex)
            }
            Dim glyphRun As System.Windows.Media.GlyphRun = New System.Windows.Media.GlyphRun(glyphTypeface, 0, False, 1, glyphIndexes, New Point(0, 0), advanceWidths, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing)
            drawingImage = New System.Windows.Media.DrawingImage(New System.Windows.Media.GlyphRunDrawing(foreground, glyphRun))
        Catch exception As System.Exception
            imageSource = Nothing
            flag = True
        End Try
        If (Not flag) Then
            imageSource = drawingImage
        End If
        flag = False
        Return imageSource
    End Function

И, наконец, создатель Listbox Entry:

Private Function CreateGlyphListboxEntry(ByVal charIntValue As Integer, ByVal glyphImage As ImageSource) As FrameworkElement
    Dim result As StackPanel = New StackPanel() With
    {
        .Orientation = Orientation.Horizontal
    }
    Dim text As TextBlock = New TextBlock() With
    {
        .Text = String.Format("{0:X}", charIntValue),
        .Foreground = Brushes.Black,
        .FontSize = 17,
        .Margin = New Thickness(10, 0, 10, 0)
    }
    result.Children.Add(text)
    If (glyphImage IsNot Nothing) Then
        Dim image As System.Windows.Controls.Image = New System.Windows.Controls.Image()
        Dim num As Double = 32
        Dim num1 As Double = num
        image.Height = num
        image.Width = num1
        image.Stretch = Stretch.Uniform
        image.Source = glyphImage
        result.Children.Add(image)
    End If
    Return result
End Function

Надеюсь это поможет!

person Jeff    schedule 14.02.2014