Example #1
0
    public void Run()
    {
        RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

        var visualizer = new MenuViewMessageInterpreter();
        var state      = new MenuViewMessage {
            Items =
            {
                MenuItemViewMessage.MakeRange("[-1, 1]: 0.5", -1, +1, 0.5, false),
                MenuItemViewMessage.MakeRange("[-1, 1]: -1",  -1, +1,  -1, true),
                MenuItemViewMessage.MakeRange("[-1, 1]: 0",   -1, +1,   0, false),
                MenuItemViewMessage.MakeRange("[-1, 1]: +1",  -1, +1,  +1, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 0.5",   0,  1, 0.5, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 0",     0,  1,   0, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 1",     0,  1,   1, false)
            }
        };
        var visual = visualizer.Interpret(state);

        var window = new Window {
            Background = Brushes.Pink,
            Content    = visual
        };

        window.Show();

        Dispatcher.Run();
    }
    public UIElement Interpret(MenuViewMessage state)
    {
        var canvas = new Canvas {
            HorizontalAlignment = HorizontalAlignment.Stretch
        };

        if (state == null)
        {
            return(canvas);
        }

        double position  = state.Position;
        double topOffset = Height / 2 - itemHeight * position;

        int firstVisibleChildIdx = IntegerUtils.Clamp(
            (int)Math.Floor(-(itemHeight + topOffset) / itemHeight),
            0, state.Items.Count);
        int lastVisibleChildIdx = IntegerUtils.Clamp(
            (int)Math.Ceiling((Height - topOffset) / itemHeight),
            0, state.Items.Count - 1);

        for (int childIdx = firstVisibleChildIdx; childIdx <= lastVisibleChildIdx; ++childIdx)
        {
            var item      = state.Items[childIdx];
            var childElem = CreateItem(item);

            canvas.Children.Add(childElem);

            Canvas.SetTop(childElem, topOffset + itemHeight * childIdx);
            childElem.Width = Width;
        }

        return(canvas);
    }