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); }