Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Выгрузка Ribbon Framework динамически с восстановлением формы

Речь идет о родном

Использую .Net -обертку, не суть (а м.б. и суть).


Идея такая (переделываю старое приложение с классическим меню + Toolbar и т.п.):

1) Дать возможность использовать Ribbon
2) При этом дать возможность использовать старый интерфейс
3) Дать таки пользователю возможность выбирать между (1) Ribbon и (2) Menu+Toolbar

Делаем тест.

1. Загружаю форму обычным образом.
Обычная форма, отображается главное меню (System.Windows.Forms.MainMenu).

2. Стартую Windows Ribbon Framework (нарочно кнопкой и динамически)
  Dim _ribbon As Ribbon

  Private Sub ButtonLoadRibbon_Click(sender As Object, e As EventArgs) Handles ButtonLoadRibbon.Click
    _ribbon = New Ribbon
    _ribbon.ResourceName = "RibbonTest.RibbonMarkup.ribbon"
    _ribbon.Dock = DockStyle.Top
    Me.Controls.Add(_ribbon)
  End Sub

Все отлично, меню убралось, появился Ribbon

3. А теперь пытаюсь переключиться обратно, как то так:
  Private Sub ButtonUnloadRibbon_Click(sender As Object, e As EventArgs) Handles ButtonUnloadRibbon.Click
    _ribbon.Framework.Destroy()
    Me.Controls.Remove(_ribbon)
  End Sub


_ribbon.Framework.Destroy() - так понимаю это

Terminates and releases all objects, hooks, and references for an instance of the Windows Ribbon framework.


И вот здесь фигня.
Ribbon убрался,
но форма стала инвалидом.
Шапка хоть и отображается, но не функциональна, клинтская область (Panel1 Dock=Fill) похоже "наехала на то место где есть шапка"
Правда если нажать F10;Стрелка вниз,
то меню окна появляется, можно закрыть, минимизировать.
Главное Меню не появилось.
Ну, прога то сама не сдохла, кнопки на ней нажимаются.
Беда только с самим окном.
Как восстановить нормальный классический вид? С шапкой и меню?
М.б. через API? Есть идеи.

P.S. Могу конечно полностью перегружать приложение (при смене режима Ribbon->Классика).
Но неужели нельзя без перестарта?

К сообщению приложен файл. Размер - 93Kb
Ответ: Клиентскую область формы при желании подвинуть можно через WM_NCCALCSIZE
Как-то так в примитиве:
  <StructLayout(LayoutKind.Sequential)>
  Public Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
  End Structure

  <StructLayout(LayoutKind.Sequential)>
  Public Structure WINDOWPOS
    Dim hwnd As IntPtr
    Dim hWndInsertAfter As IntPtr
    Dim x As Integer
    Dim y As Integer
    Dim cx As Integer
    Dim cy As Integer
    Dim Flags As UInteger
  End Structure

  <StructLayout(LayoutKind.Sequential)>
  Public Structure NCCALCSIZE_PARAMS
    Dim rgrc0 As RECT
    Dim rgrc1 As RECT
    Dim rgrc2 As RECT
    Dim lppos As WINDOWPOS
  End Structure

  Dim h_delta As Integer = 0
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    'Debug.WriteLine(m.ToString())
    Dim csp As NCCALCSIZE_PARAMS

    Select Case m.Msg
      Case WM_NCCALCSIZE
        If m.WParam = IntPtr.Zero Then
        Else
          If _ribbon Is Nothing Then
            csp = CType(Marshal.PtrToStructure(m.LParam, GetType(NCCALCSIZE_PARAMS)), NCCALCSIZE_PARAMS)
            csp.rgrc0.Top = csp.rgrc0.Top + h_delta
            Marshal.StructureToPtr(csp, m.LParam, False)
            m.Result = IntPtr.Zero
          End If
        End If
        Debug.WriteLine(m.ToString())
    End Select


    ' Forward message to base WndProc.
    MyBase.WndProc(m)
  End Sub

  Dim _ribbon As Ribbon

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  End Sub

  Private Sub ButtonUnloadRibbon_Click(sender As Object, e As EventArgs) Handles ButtonUnloadRibbon.Click
    Me.Controls.Remove(_ribbon)
    _ribbon.Framework.Destroy()
    _ribbon = Nothing
    SetMenu(Me.Handle, Me.MainMenu1.Handle)
  End Sub

  Private Sub ButtonLoadRibbon_Click(sender As Object, e As EventArgs) Handles ButtonLoadRibbon.Click
    Dim h_init As Integer = Me.ClientSize.Height
    _ribbon = New Ribbon
    _ribbon.ResourceName = "RibbonTest.RibbonMarkup.ribbon"
    _ribbon.Dock = DockStyle.Top
    _ribbon.TabStop = False
    Me.Controls.Add(_ribbon)
    If h_delta = 0 Then h_delta = Me.ClientSize.Height - h_init
    Debug.Print(h_delta)
  End Sub


Но все одно глючит.
Под меню какая-то глючная полоска (непрорисованный верхний кусок панели и это Refresh-Update опять же не лечится, хотя с кнопками вроде все OK, картинку приложил ниже).
Ну еще восстановление меню через SetMenu имеет свои ньюансы: если уменьшать ширину формы и строка меню займет 2 строчки, то меню наедет на клиентскую область.
Т.е. после убирания риббон-контрола макет все одно поломан, лечи не лечи.

На 7-ке кстати динамическое Me.Controls.Add(_ribbon) тоже подглючивает (на 10-ке нормально), правда лечится переигрыванием
FormWindowState.Normal-> FormWindowState.Minimized ->FormWindowState.Normal

Пожалуй пора забить на этот конкретный вопрос. Через перезагрузку формы вполне достаточно.

Контрол () супер (главное полностью оборачивает Native), но мелких глюков хватает.
Например когда не все картинки не на всех кнопках добавляются и от чего зависит хз (м.б. уборщик мусора, но вина не моя, проверял) или надписи вовремя не обновляются.
Всякими переигрываниями вроде лечится.

К сообщению приложен файл. Размер - 51Kb
Вопрос: получить данные текущей строки DevExpress ResourcesTree

День добрый.
появилась необходимость отображать в приложении диаграммы Ганта (графики ремонта), решил воспользоваться DevExpress SchedulerControl. Сделал аналогично прилагаемой демке, все получилось осталось одно но.... Как при двойном клике по строке ResourcesTree получить Id ресурса.
в DataSource у него DevExpress.XtraScheduler.Native.ResourceTreeData, а вот как получить биндинг к строке данных?
Ответ: ага прошу прощения получилось

DevExpress.XtraScheduler.Native.ResourceTreeData rtd = (DevExpress.XtraScheduler.Native.ResourceTreeData)((ResourcesTree)sender).GetDataRecordByNode(((ResourcesTree) sender).FocusedNode);

 int intId = (int)rtd.Resource.Id;
Вопрос: VS 2010 + DevExpress

почему-то стала при каждом запуске VS 2010 в панель инструментом грузить одни и те же компоненты DevExpress. солюшн стал очень долго открываться
Ответ:
Axeleron
kmaw
пропущено...


а со старым DevExpress нет

Ну потому что пакет DevExpress (как и прочие) качаются и ставятся под определенную версию Студии, а не фреймуорка.


Кхммм... Господа, для вас проблема заюзать компонент из фреймфорка более ранней версии?
У нас же не Java....
Вопрос: DevExpress. Как установить связь между tcxButtonEdit и tcxBarEditItem в обработчике

На Ribbon-панели создан tcxBarEditItem
Properties=tcxButtonEditProperties
Как в обработчике Properties.OnButtonClick "добраться" до tcxBarEditItem?

procedure TFormXml.EditButtonEditPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  ShowMessage(Sender.ClassName); // tcxButtonEdit
  // Как получить соответсвующий BarEditItem? 
end;
Ответ: Господа, очень признателен за "ответы",
но можно вместо изложения общеизвестных, но не относящихся к данному вопросу способов "шевелить ушами" предложить решение для конкретного обработчика конкретного tcxEditProperties конкретного tcxBarEditItem

procedure TForm.EditButtonEditPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);

Как получить BarEditItem, а не tcxButtonEdit
Вопрос: DevExpress dxRibbon SupportNonClientDrawing и контексты

Добрый день.

Помогите разобраться, пожалуйста.
Вот что написано в документации:
Set the SupportNonClientDrawing property to True to render the non-client area using a Ribbon style.

И вот что получается у меня:
1) SupportNonClientDrawing := False

однако, заголовок раскрашен согласно выбранного стиля dxRibbon. Но при этом не прорисовывается имя контекста

1) SupportNonClientDrawing := True

а тут контекст прорисован, но сам заголовок игнорирует стиль, выбранный у dxRibbon

что я делаю не так?
Ответ: ну, т.е. я хотел бы и стиль окна иметь, и контекст видеть, как рисунок в справке.
Вопрос: DevExpress Wpf

Добрый вечер, господа.
Кто-нибудь покупал (комплект контролов для WPF, за $899.99 на текущую дату)?
Интересует состав "пакета", а именно, входят ли в нее следующие библиотеки:
  • DevExpress.Data.v{Version}.dll
  • DevExpress.Images.v{Version}.dll
  • DevExpress.Mvvm.v{Version}.dll
  • DevExpress.Printing.v{Version}.Core.dll
  • DevExpress.Xpf.Core.v{Version}.dll
  • DevExpress.Xpf.Docking.v{Version}.dll
  • DevExpress.Xpf.Grid.v{Version}.dll
  • DevExpress.Xpf.Grid.v{Version}.Core.dll
  • DevExpress.Xpf.Grid.v{Version}.Extensions.dll
  • DevExpress.Xpf.Layout.v{Version}.Core.dll
  • DevExpress.Xpf.LayoutControl.v{Version}.dll
  • DevExpress.Xpf.Printing.v{Version}.dll
  • DevExpress.Xpf.Themes.DXStyle.v{Version}.dll
    , где {Version} - версия продукта.
  • Ответ:
    Сон Веры Павловны
    Дотнетовские компоненты от DX именно этим и славятся - сверхнавороченным функционалом, и сверхтормознутостью. Что для WPF, что для винформс - картина одна и та же.

    каждая ячейка в DevExрress это UIElement, а у GraрeCity это просто рендеринг, либо Visual, либо ручной, я не вникал особо.
    для достижения высокой прои3водительности в WРF я и сам иногда исполь3ую Visaul, так как содержимое ячейки совсем не обя3ательно делать в UIElement'аx. Особенно, если шаблон сложный, много всякиx Grid'ов в ячейкаx при иx большом количестве видимом на экране, лучше делать 1 ячейка, 1 контрол, либо весь ViewРort отдельным контролом (бе3 ви3. дерева), в котором содержатся Visual об_екты, еще большой минус в том, что все события надо делать самому, логику фокуса и прочее, гемороя очень много. Это если не выxодить 3а рамки WРF, вроде еще можно исполь3овать DirectX и встроить его в WРF, думаю это в плане прорисовки UI будет максимально быстро, но сам не пробовал. Может есть, кто уже это делал, на этом форуме?
    Вопрос: Кнопка на ленте View Ribbon скрыт в зависимости от прав

    Добрый день! Столкнулась с такой проблемой: создала кнопку на Ленте с помощью SharePoint Disigner 2010 "Custom Action" - View Ribbon, повесила на эту кнопку рабочий процесс. Теперь мне нужно скрыть кнопку на Ленте в зависимости от выбранного статуса в списке "Утверждение" или "Утвержден".
    Как скрыть кнопку вообще это я нашла как можно сделать (сделала с помощью Редактора контента, прописала id кнопки и поставила Display = none), а вот как от условий скрыть или прав пользователя не нашла. Скрыть кнопку нужно без Visual Studio
    Ответ: Anna2013,

    можно написать условие на javascript, при выполнении которого кнопка будет активной.
    Вопрос: Как дебажить GUI или проблемы с Fluent Ribbon Control Suite

    WPF.

    Я использую Fluent Ribbon Control Suite. У меня в контроле Spinner почему-то непонятные дефолтные значения указываются. У этого контрола есть такие свойства, как Minimum, Maximum и Value, которые могут за это отвечать. При этом в дебаге привязки с помощью конвертера проверял, что из модели у меня приходят значения, скажем, Minimum=1, Maximum=100, Value=15, а дефолтное значение на контроле - 10. При этом, если начать пользоваться этим значением, то оно только в самом контроле, а в модели по-прежнему 15 - проверял в дебаге по свойству модели. Но, если сделать фокус на контоле, а потом убрать его, то у контрола срабатывает его внетренний триггер и он изменяет значение свойства модели с моего 15 на свой 10.

    Причём это явно не какое-то внутреннее дефолтное значение, т. к. при других значениях максимума, минимума и дефолтного значения моей модели, на контроле тоже другое дефолтное значение. Скажем, у меня был минимум 1,0, максимум 1 000 000 000,0, а значение в модели 40 000 000,0. При этом спиннер показывал сразу после загрузки интерфейса значение 100 000,0. И всё то же самое - нигде в дебаге или в своём коде я такое значение не встречал.

    Ума не приложу, как такое может быть. Поэтому посмотреть, что он там внутри делает. Но это вроде как сторонний компонент, хоть и с открытым исходным кодом. Самое простое, что я знаю, это найти проект с этим контролом и подключить его в своё решение. Тогда можно в самом проекте поставить точку останова и Студия остановится на этом месте. А можно как-то без подключения чужих проектов в своё решение?
    Ответ: Alexey2112,

    a) Используйте программы шпионы (сам пользуюсь Snoop! (
    Программа полностью отображает визуальное дерево и все свойства и привязки всех элементов этого дерева. Очень удобно. Так же помогает быстро найти битые привязки
    б) Использовать IntelliSense, если Exception возникает, но так как выполняется внутри UI и не "возбуждается"
    Вопрос: Sharepoint 2010 - Ribbon

    Добрый день уважаемые!

    Подскажите пожалуйста как лучше всего скрыть Ribbon допустим для определенной группы?
    А для группы владельцы она была видна.
    Спасибо.
    Ответ: Castromen,

    Вот, например.
    Вопрос: OleContainer,Word 2007 как убрать Ribbon панели

    Добрый вечер, мастера, подскажите пожалуйста, как убрать панели "Ribbon" (т.е панели Word'a 2007+) при открытии документа через OleContainer.

    Как убрать панели простые ворд 97-2003 я в курсе, а вот как рибоны спрятать не могу найти в нете, если кто знает подскажите пожалуйста.
    Ответ: dimonpage1,

    Перерыл кучу форумов по поводу этой проблемы. Еле нашел решение. Убиваются все тулбары и лента. Все будет аккуратно помещаться внутри контейнера. Дополнительно еще можно указать область для вывода данных внутри контейнера. Вот пример кода (на форме находится OleContainer1):

    uses OleCtnrs, ActiveX;
    
    ...
    
    procedure PaintRect;
    var
      IOPO: IOleInPlaceObject;
      r1: trect;
    begin
      r1.Left := 1;
      r1.Top := 1;
      r1.Right := 100;
      r1.Bottom := 100;
    
      OleContainer1.OleObjectInterface.QueryInterface(IOleInPlaceObject, IOPO);
      IOPO.UIDeactivate;  
      IOPO.SetObjectRects(r1, r1);  // задаем внутри контейнера область для вывода данных (прямоугольником r1)
      IOPO := nil;
    end;